2013-05-06 1 views
68

Quando provo a compilare questa classe con javac, ottengo un errore di compilazione e Test.class non viene creato.In che modo Eclipse può creare una classe con problemi di compilazione non risolti?

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

Ma quando creo questa classe in Eclipse, vedo che Test.class appare nella destinazione/classi. Quando provo ad eseguire questa classe da riga di comando con java.exe, ottengo

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from long to int

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

+11

+1. Bella domanda, non ci avevo mai pensato :) – Maroun

risposta

64

Questo è come 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 decompilare il file di classe, si può vedere la main() il metodo del file di classe, che il compilatore ha generato sopra. Questo a causa dello compiler che utilizza Eclipse (Compilatore Eclipse per Java) non è lo stesso del compilatore standard Java!

+0

Quindi, non usa 'javac', quindi qualcuno può compilare un file .java in Eclipse dopo aver eliminato il file' javac.exe' dal kit JDK? Solo curioso. :) –

+5

@ChaZ - Dai un'occhiata a questa [domanda] (http://stackoverflow.com/questions/3061654/what-is-the-difference-between-javac-and-the-eclipse-compiler?lq=1). Citando una battuta dalla risposta - Il fatto che Eclipse abbia un proprio compilatore è evidente anche perché puoi scrivere, compilare ed eseguire codice Java in Eclipse senza nemmeno installare l'SDK Java. Spero che questo sia rivolto alla tua curiosità! :) – SudoRahul

+0

: Sicuramente lo ha fatto. ;) –

41

Eclipse utilizza il compilatore IBM che ha una possibilità di creazione di classi che non compilano, sostituendo gli errori con

throw new Error(); 

IMHO, questo è molto cattiva pratica e ho visto alcuni progetti molto scarsa qualità usano 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 si scrive codice prototipo rapidamente, cioè il codice che si sa non entrerà mai in produzione. (È difficile essere certi che sia così)

+13

Sembra che la morte mi chiami. Quando scrivo un codice, provo spesso, e penso che la maggior parte delle persone dovrebbe provare a fare in modo che il codice si rompa in fase di compilazione, piuttosto che lasciarlo andare come un bug e interrompere la produzione. Ora l'ovvio errore di compilazione è permesso di essere velato, che può essere killer/ – mawia

+2

Penso che in associazione con tutto ciò che assiste ai contenuti, correzione automatica, evidenziazione, esploratore di pacchetti, ... Eclipse ti offre quasi da non perdere bug come quello . Dal mio punto di vista va bene testare classi che non si compilano, ad esempio dopo aver implementato un'interfaccia, si dovrebbero scrivere diversi ritorni inutili per testare un singolo metodo ... Penso che questo porterebbe ad una discussione accanita, Volevo solo offrire un'alternativa. –

+1

@FranzEbner Non ci dovrebbe essere la possibilità che il codice in esecuzione non venga compilato. ;) IMHO, codice Mocking è un modo migliore per gestire le interfacce nei test. –

26

Sì, Eclipse utilizza un proprio compilatore speciale; noto come "ecj". Da Stack Overflow questione What is the difference between javac and the Eclipse compiler?:

One notable difference is that the Eclipse compiler lets you run code that didn't actually properly compile. If the block of code with the error is never ran, your program will run fine. Otherwise it will throw an exception indicating that you tried to run code that doesn't compile.