当我尝试用javac编译这个类时,我得到一个编译错误,Test.class没有被创建。
public class Test {
public static void main(String[] args) {
int x = 1L; // <- this cannot compile
}
}
字符串
但是当我在Eclipse中创建这个类时,我可以看到Test.class出现在target/classes中。
线程“main”java.lang中出现异常。错误:未解决的编译问题:
类型不匹配:无法从long转换为int
Eclipse是否使用它自己特殊的Java编译器来创建一个损坏的.class?java.exe如何知道.class中的编译问题?
3条答案
按热度按时间g6ll5ycj1#
Eclipse使用IBM编译器,该编译器可以选择创建不编译的类,将错误替换为
字符串
恕我直言,这是非常糟糕的做法,我见过一些质量很差的项目使用这种方法。
与快速失败策略不同,它试图最大限度地减少错误的成本,尽可能晚地发现错误也可以最大限度地提高修复错误的成本。
这种策略只适用于快速编写原型代码的情况,也就是说,你知道代码永远不会进入生产环境。(很难确定情况会是这样)
v1l68za42#
是的,Eclipse使用自己的特殊编译器;称为“ecj”。来自堆栈溢出问题 * What is the difference between javac and the Eclipse compiler? *:
一个显著的区别是Eclipse编译器允许你运行实际上没有正确编译的代码。如果带有错误的代码块从未运行过,你的程序将运行良好。否则它将抛出一个异常,表明你试图运行没有编译的代码。
xv8emn3q3#
如果你反编译你的类文件,你可以看到下面的
main()
方法。这就是Java编译器如何知道类中的编译错误。字符串
这一切都是因为compiler(Eclipse Java编译器),Eclipse默认使用/捆绑使用,与标准Java编译器不同!