Eclipse如何创build一个没有解决的编译问题的类?

当我尝试编译这个类与javac,我得到一个编译错误,Test.class不创build。

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

但是当我在Eclipse中创build这个类时,我可以看到Test.class出现在target / classes中。 当我尝试从java.exe的命令行运行这个类,我得到

线程“main”中的exceptionjava.lang.Error:未解决的编译问题:
types不匹配:不能从long转换为int

Eclipse是否使用自己特殊的Java编译器创build一个破损的.class? java.exe如何知道.class中的复杂问题?

这是Java编译器如何知道类中的编译错误。

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

如果你反编译你的类文件,你可以看到编译器生成的类文件的main()方法。 这是因为Eclipse使用的编译器 ( Eclipse编译器for Java )与标准的Java编译器不一样!

Eclipse使用IBM编译器,该编译器可以创build不能编译的类,并用错误replace错误

 throw new Error(); 

恕我直言,这是非常糟糕的做法,我看到一些质量很差的项目使用这个。 这个项目一次也没有完全编译好几个星期。

不像失败的快速策略,尽量减less错误的成本,尽可能迟的发现错误也最大化了修复它们的成本。

这个策略只有在你快速编写原型代码时才有效,例如你知道的代码永远不会投入生产。 (这是很难确定的情况)

是的, Eclipse使用它自己的特殊编译器; 被称为“ecj”。 从堆栈溢出问题javac和Eclipse编译器有什么区别?

一个显着的区别是Eclipse编译器可以让你运行实际上没有正确编译的代码。 如果错误代码块从未运行,您的程序将运行正常。 否则,它会抛出一个exception,表示你试图运行不能编译的代码。