Eclipse如何创建一个具有未解决的编译问题的类?

Evg*_*eev 68 java eclipse compiler-errors

当我尝试用javac编译这个类时,我得到一个编译错误,并且没有创建Test.class.

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

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

线程"main"中的异常java.lang.Error:未解决的编译问题:
类型不匹配:无法从long转换为int

Eclipse是否使用自己的特殊Java编译器来创建损坏的.class?java.exe如何知道.class中的complilation问题?

Sud*_*hul 64

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

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

如果您对类文件进行反编译,则可以看到main()编译器生成的类文件的上述方法.这是因为Eclipse使用的编译器(Eclipse Compiler for Java)与标准Java编译器不同!

  • @ChaZ - 看看这个[问题](http://stackoverflow.com/questions/3061654/what-is-the-difference-between-javac-and-the-eclipse-compiler?lq=1).从答案中引用一句话 - "Eclipse自带编译器这一事实也很明显,因为您可以在Eclipse中编写,编译和运行Java代码,甚至无需安装Java SDK.希望能满足您的好奇心!:) (5认同)

Pet*_*rey 41

Eclipse使用IBM编译器,它可以选择创建不编译的类,用.替换错误

throw new Error();
Run Code Online (Sandbox Code Playgroud)

恕我直言,这是非常糟糕的做法,我看到一些质量很差的项目使用这个.该项目一次没有完全编译数周.

与尝试最小化错误成本的失败快速策略不同,尽可能晚地发现错误也会最大化修复它们的成本.

这种策略只有在您快速编写原型代码时才有效,即您知道的代码永远不会投入生产.(很难确定会出现这种情况)

  • 听起来像死神打电话给我.在编写代码时,我经常尝试,并且我认为大多数人都应该尝试,在编译时使代码中断,而不是让它成为一个bug并在生产中破解.现在明显的编译时错误被允许隐藏,这可能是杀手/ (13认同)
  • 我认为与所有内容辅助,自动更正,突出显示,包浏览器相关联... Eclipse提供了几乎不能错过的错误.从我的观点来看,测试不能编译的类是可以的,例如在你实现一个接口之后,你将不得不写几个无用的返回来测试一个单独的方法...我认为这会导致讨论,我只是想提供另一种选择. (2认同)
  • Eclipse编译器允许这样做的优点是,您可以在自己的计算机上编写新代码(尚未编译)时实际运行现有代码. (2认同)

Eri*_*ert 26

是的,Eclipse使用自己的特殊编译器; 被称为"ecj".来自Stack Overflow问题javac和Eclipse编译器有什么区别?:

一个值得注意的区别是Eclipse编译器允许您运行实际上没有正确编译的代码.如果从未运行带有错误的代码块,则程序运行正常.否则,它将抛出一个异常,表明您尝试运行无法编译的代码.