【问题标题】:How eclipse execute java code when there are compile errorseclipse出现编译错误时如何执行java代码
【发布时间】:2012-05-19 18:37:50
【问题描述】:

当下面的java代码在eclipse中执行时,它给出了正确的输出(即打印'Class B'),但根据java规范,无法编译代码(因为超类构造函数需要int参数并且编译器为B类提供的构造函数包括对超类无arg构造函数的调用,该构造函数未定义),当尝试在命令行中使用javac命令编译文件时,它只编译超类即A类并因以下编译错误而失败:

B.java:8: cannot find symbol
symbol  : constructor A()
location: class A
public class B extends A {
   ^
1 error

以下是java文件内容:

class A {

    public A(int x) {
        //
    }
}

public class B extends A {

    public static void main(String[] args) {
        System.out.println("Class b");
    }
}

谁能解释一下 eclipse 如何在 bieng 无法编译类的情况下执行 main 方法。提前致谢。

更新

我删除了bin文件夹中eclipse创建的.class文件,尝试执行该类,但无法编译,因此没有运行。但是当我创建了一个带有公共类名的源文件并保存时没有任何内容,然后添加了上述内容,它就起作用了。如果eclipse使用之前编译的版本执行,怎么能给出main方法的输出呢,因为它在完整编译成功的时候没有main方法呢?

【问题讨论】:

  • 你是在执行同一个文件还是在运行其他主类?

标签: java eclipse compilation


【解决方案1】:

实际上,eclipse 尝试编译该类并且由于构建错误而无法编译,当您简单地运行那些文件时,它执行了先前编译的类,该类之前已成功编译(eclipse 尝试编译和构建文件每次保存都按照通用设置)。

为了解决你可以在运行前尝试清理项目,而对于javac,它只是编译,

【讨论】:

  • 感谢您的回答,eclipse显示编译错误,但我的问题是eclipse如何执行代码并给出输出,尽管有编译错误。
  • 它基于之前编译版本的文件,编译成功后只会替换那些旧的class文件
  • 尝试清理项目,但它仍然给出相同的输出,而且我在eclipse中创建了源文件并在最后(输入所有代码后)保存,因此不可能有该类的先前编译版本。
  • 但是当我们做同样的事情时它报告了问题,我根本无法运行,你能不能尝试创建一个新的工作区,看看它是否在那里工作
  • 根据我的问题的更新,我不明白的是eclipse如何将源代码的新部分插入到以前编译的类中。
【解决方案2】:

Eclipse 使用自己的 Java 编译器(称为 ecj)而不是 javac。这个编译器allows (partial) compilation of broken source files.

【讨论】:

    【解决方案3】:

    Eclipse 不应该那样做。它导致模棱两可的结果。如果无法编译一个类,则应删除其对应的 .class 文件。

    如果您检查 bin 文件夹,则存在 B.class 和 A.class。不知道为什么它会创建 B.class,即使 B 没有编译

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多