Domanda In che modo Eclipse può creare una classe con problemi di compilazione non risolti?


Quando provo a compilare questa classe con javac, ottengo un errore di compilazione e Test.class non viene creato.

public class Test {
    public static void main(String[] args) {
        int x = 1L;  // <- this cannot compile
    }
}

Ma quando creo questa classe in Eclipse, posso vedere che Test.class appare in target / classi. Quando provo a eseguire questa classe dalla riga di comando con java.exe, ottengo

Eccezione nel thread "main" java.lang.Error: problema di compilazione non risolto:
        Tipo mancata corrispondenza: impossibile convertire da long a int

Eclipse usa il suo speciale compilatore Java per creare un file .class rotto? In che modo java.exe è a conoscenza dei problemi di complizzazione in .class?


68
2018-05-06 07:36


origine


risposte:


Questo è il modo in cui il compilatore Java conosce l'errore di compilazione nella classe.

public static void main(String[] paramArrayOfString)
{
    throw new Error("Unresolved compilation problem: \n\tType mismatch: cannot convert from long to int.\n");
}

Se decompilate il vostro file di classe, potete vedere quanto sopra main() metodo del file di classe, che il compilatore ha generato. Questo è a causa del compilatore che utilizza Eclipse (Compilatore Eclipse per Java) non è lo stesso del compilatore standard Java!


64
2018-05-06 07:40



Eclipse utilizza il compilatore IBM che ha la possibilità di creare classi che non vengono compilate, sostituendo gli errori con

throw new Error();

IMHO, questa è una pessima pratica e ho visto alcuni progetti di scarsa qualità usare questo. Il progetto non è stato compilato completamente per settimane alla volta.

A differenza delle strategie di fail fast, che cercano di minimizzare il costo dei bug, scoprire i bug il più tardi possibile massimizza anche il costo del loro fixing.

Questa strategia funziona solo se stai scrivendo rapidamente un codice prototipo, cioè il codice che conosci non entrerà mai in produzione. (È difficile essere sicuri che sarà così)


41
2018-05-06 07:38



Sì, Eclisse usa un proprio compilatore speciale; noto come "ecj". Dalla domanda di overflow dello stack Qual è la differenza tra javac e il compilatore Eclipse?:

Una differenza degna di nota è che il compilatore Eclipse consente di eseguire codice che in realtà non è stato compilato correttamente. Se il blocco di codice con l'errore non viene mai eseguito, il programma funzionerà correttamente. Altrimenti genererà un'eccezione che indica che hai provato a eseguire codice che non viene compilato.


26
2018-05-06 07:39