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


69

当我尝试使用javac编译此类时,出现编译错误,并且未创建Test.class。

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

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

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

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


11
+1。好问题,我从没想过:)
— Maroun

Answers:


64

这就是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的Java编译器)是不一样的标准Java编译器!


因此,它不使用javac,那么javac.exe从JDK工具包删除文件后,有人可以在Eclipse中编译.java文件吗?只是好奇。:)
— CᴴᴀZ

5
@ChaZ-看一下这个问题。从答案中The fact that Eclipse comes with its own compiler is also apparent because you can write, compile, and run Java code in Eclipse without even installing the Java SDK.
— 引出

42

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

throw new Error();

恕我直言,这是非常糟糕的做法,我已经看到一些质量很差的项目使用此方法。该项目一次不能完整编译几个星期。

与尝试使错误的成本最小化的快速失败策略不同,尽早发现错误也使修复错误的成本最大化。

仅当您正在快速编写原型代码(即,您知道的代码永远不会投入生产)时,此策略才有效。(很难确定会是这种情况)


13
听起来像是死亡呼唤我。在编写代码时,我经常尝试并且我认为大多数人都应该尝试使代码在编译时中断,而不是将其视为错误并在生产时中断。现在可以掩盖明显的编译时错误,这可能是致命的
— mawia

2
我认为与所有内容辅助,自动更正,突出显示,包资源管理器相关联... Eclipse为您提供了几乎不能错过的bug。从我的角度来看,可以测试未编译的类,例如,在实现一个接口之后,您将不得不编写多个无用的返回值来测试单个方法...我认为这将导致冗长的讨论,我只是想提供一个替代方案。
— 弗朗兹·埃布纳

1
@FranzEbner应该没有机会运行甚至不编译的代码。;)恕我直言,模拟代码是处理测试中接口的更好方法。
— 彼得·劳瑞

2
Eclipse编译器允许这样做的优点是,您实际上可以在自己的计算机上运行现有代码,同时编写新代码(尚未编译)。
— 托尔比约恩Ravn的安徒生

1
@PeterLawrey我同意故意发布不编译的代码是一件坏事。您提到的“质量很差的项目”会从引入构建机器人中受益吗?
— 托尔比约恩Ravn的安徒生

27

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

一个显着的区别是Eclipse编译器使您可以运行实际上未正确编译的代码。如果永远不会运行带有错误的代码块,则您的程序将正常运行。否则,它将引发异常,表明您试图运行未编译的代码。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.