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

vu8f3i0k  于 2023-11-18  发布在  Eclipse
关注(0)|答案(3)|浏览(199)

当我尝试用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中的编译问题?

g6ll5ycj

g6ll5ycj1#

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

throw new Error();

字符串
恕我直言,这是非常糟糕的做法,我见过一些质量很差的项目使用这种方法。
与快速失败策略不同,它试图最大限度地减少错误的成本,尽可能晚地发现错误也可以最大限度地提高修复错误的成本。
这种策略只适用于快速编写原型代码的情况,也就是说,你知道代码永远不会进入生产环境。(很难确定情况会是这样)

v1l68za4

v1l68za42#

是的,Eclipse使用自己的特殊编译器;称为“ecj”。来自堆栈溢出问题 * What is the difference between javac and the Eclipse compiler? *:
一个显著的区别是Eclipse编译器允许你运行实际上没有正确编译的代码。如果带有错误的代码块从未运行过,你的程序将运行良好。否则它将抛出一个异常,表明你试图运行没有编译的代码。

xv8emn3q

xv8emn3q3#

如果你反编译你的类文件,你可以看到下面的main()方法。这就是Java编译器如何知道类中的编译错误。

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

字符串
这一切都是因为compilerEclipse Java编译器),Eclipse默认使用/捆绑使用,与标准Java编译器不同!

相关问题