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.