【问题标题】:How can Eclipse create a class with unresolved compilation problems?Eclipse 如何创建一个未解决编译问题的类?
【发布时间】:2013-04-29 22:29:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • +1。好问题,我从来没想过:)

标签: java eclipse compiler-errors


【解决方案1】:

这是 Java 编译器知道类中的编译错误的方式。

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

如果你反编译你的class文件,你可以看到上面的class文件的main()方法,是编译器生成的。这是因为 Eclipse 使用的compilerEclipse Compiler for Java)与标准的 Java 编译器不一样!

【讨论】:

  • 那么,它不使用javac,那么在从JDK工具包中删除javac.exe文件后,有人可以在Eclipse中编译一个.java文件吗?只是好奇。 :)
  • @ChaZ - 看看这个question。从那里的答案中引用一行 - 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. 希望能解决您的好奇心!:)
【解决方案2】:

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

throw new Error();

恕我直言,这是非常糟糕的做法,我看到一些质量很差的项目使用它。该项目一次没有完全编译好几个星期。

与试图最小化错误成本的快速失败策略不同,尽可能晚地发现错误也可以最大限度地提高修复它们的成本。

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

【讨论】:

  • 听起来像是死亡在召唤我。在编写代码时,我经常尝试,而且我认为大多数人都应该尝试让代码在编译时中断,而不是让它成为一个错误并在生产中中断。现在允许掩盖明显的编译时错误,这可以是杀手/
  • 我认为与所有内容辅助、自动更正、突出显示、包资源管理器相关联...... Eclipse 为您提供了几乎不会错过这样的错误。从我的角度来看,测试不编译的类是可以的,例如在实现一个接口之后,你必须编写几个无用的返回来测试一个方法......我认为这会导致顽固的讨论,我只是想提供一个替代方案。
  • @FranzEbner 你不应该有机会运行甚至无法编译的代码。 ;) 恕我直言,模拟代码是在测试中处理接口的更好方法。
  • Eclipse 编译器允许这样做的优点是,您可以在自己的计算机上编写新代码(尚未编译)时实际运行现有代码。
  • @PeterLawrey 我同意故意发布不编译的代码是一件坏事。您提到的“质量非常差的项目”是否会从引入构建机器人中受益?
【解决方案3】:

是的,Eclipse 使用自己的特殊编译器;被称为“ecj”。来自 Stack Overflow 问题What is the difference between javac and the Eclipse compiler?

一个显着的区别是 Eclipse 编译器允许您运行实际上没有正确编译的代码。如果出现错误的代码块从未运行,您的程序将运行良好。否则它会抛出一个异常,表明你试图运行无法编译的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 2023-02-17
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多