当编译错误时,eclipse如何执行java代码

当在eclipse中执行以下java代码时,它会给出正确的输出(即打印’Class B’),但根据java规范,代码无法编译(因为超类构造函数需要一个int参数,并且构造函数由B类的编译器包括对超类no 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方法。 提前致谢。

UPDATE

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

Eclipse使用自己的Java编译器(称为ecj )而不是javac 。 此编译器允许(部分)编译损坏的源文件 。

实际上,eclipse尝试编译类并且由于构建错误而无法编译,当你只是运行那些执行先前编译的类的文件时,这些文件已经成功编译(eclipse尝试编译并在每次保存时构建文件为每个通用设置)。

为了解决你可以尝试在运行之前清理项目,而在javac的情况下,它只是编译,

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

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