java - ¿Cómo puede Eclipse crear una clase con problemas de compilación no resueltos?
compiler-errors (3)
Así es como el compilador de Java sabe sobre el error de compilación en la clase.
public static void main(String[] paramArrayOfString)
{
throw new Error("Unresolved compilation problem: /n/tType mismatch: cannot convert from long to int./n");
}
Si descompila su archivo de clase, puede ver el método main()
del archivo de clase, que el compilador ha generado. Esto se debe a que el compiler que usa Eclipse ( Eclipse Compiler for Java ) no es lo mismo que el compilador estándar de Java.
Cuando intento compilar esta clase con javac, aparece un error de compilación y no se crea Test.class.
public class Test {
public static void main(String[] args) {
int x = 1L; // <- this cannot compile
}
}
Pero cuando creo esta clase en Eclipse, puedo ver que Test.class aparece en target / classes. Cuando trato de ejecutar esta clase desde la línea de comando con java.exe, obtengo
Excepción en el hilo "principal" java.lang.Error: Problema de compilación no resuelto:
Tipo no coincidente: no se puede convertir de largo a int
¿Eclipse usa su propio compilador especial de Java para crear una .class rota? ¿Cómo sabe java.exe sobre los problemas de complilación en .class?
Eclipse usa el compilador de IBM que tiene la opción de crear clases que no compilan, reemplazando errores con
throw new Error();
En mi humilde opinión, esta es una práctica muy mala y he visto algunos proyectos de muy mala calidad utilizar esto. El proyecto no compiló completamente por semanas a la vez.
A diferencia de las estrategias fallidas, que intentan minimizar el costo de los errores, descubrir errores lo más tarde posible también maximiza el costo de solucionarlos.
Esta estrategia solo funciona si está escribiendo un código de prototipo rápidamente, es decir, un código que sabe que nunca entrará en producción. (Es difícil estar seguro de que este será el caso)
Sí, Eclipse usa su propio compilador especial; conocido como "ecj". De la pregunta de ¿ Cuál es la diferencia entre javac y el compilador de Eclipse? :
Una diferencia notable es que el compilador de Eclipse le permite ejecutar código que en realidad no se compiló correctamente. Si el bloque de código con el error nunca se ejecuta, su programa se ejecutará correctamente. De lo contrario, lanzará una excepción que indica que intentó ejecutar código que no compila.