当有编译错误时,Eclipse如何执行Java代码

3
在eclipse中执行以下java代码时,会得到正确的输出(即打印出“Class B”),但根据Java规范,该代码无法编译(因为超类构造函数需要一个int参数,编译器提供给类B的构造函数包含对超类无参构造函数的调用,但未定义这个构造函数)。尝试使用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如何在无法编译类的情况下执行主方法吗?提前谢谢。
更新:我删除了eclipse在bin文件夹中创建的.class文件并尝试执行该类,但它无法编译,因此无法运行。但是当我创建一个具有公共类名称并保存不带任何内容的源文件,然后添加上述内容时,它可以工作。如果eclipse使用先前编译的版本来执行,则它如何给出main方法的输出,因为在成功编译时它没有main方法?

你是在执行同一个文件还是运行其他的主类? - Nitin Chhajer
3个回答

5

实际上,Eclipse 尝试编译类,但由于构建错误而无法编译。当您仅运行那些文件时,它会执行先前成功编译的类(Eclipse 根据通用设置在每次保存时尝试编译和构建文件)。

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


1
谢谢你的回答,Eclipse显示编译错误,但我的问题是,尽管存在编译错误,Eclipse如何执行代码并给出输出。 - Dilini Rajapaksha
3
它基于先前编译版本的文件,仅在成功编译后替换那些旧的类文件。 - Akash Yadav
但是当我们尝试做相同的事情时,它报告了问题,我甚至无法运行。你能否尝试创建一个新的工作区,并查看是否可以在那里正常工作呢? - Akash Yadav
它不会添加任何部分,只是在成功编译后用全新的文件替换它们。 - Akash Yadav
请查看我的更新。当最后一次成功编译的只是没有主方法的源文件时,Eclipse如何在编译错误的情况下输出main方法的结果? - Dilini Rajapaksha
显示剩余2条评论

2

1

Eclipse不应该这样做。这会导致结果不明确。如果一个类无法编译,那么它对应的.class文件应该被删除。

如果你检查bin文件夹,B.class和A.class是存在的。不确定为什么它会创建B.class,即使B没有编译成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接