编译器错误,但程序执行正常

时间:2018-04-03 15:31:46

标签: java

我对下面的代码感到困惑,Eclipse将编译器错误显示为"这种静态方法无法隐藏Super"但是在执行时它工作正常。

package com.journaldev.java;

public class Test {

    public static void main(String[] args) {
        Super s = new Subclass();
        s.foo();
    }
}

class Super {
    void foo() {
        System.out.println("Super");
    }
}

class Subclass extends Super {
    static void foo() {
        System.out.println("Subclass");
    }

}

请参阅下图中的输出,有人可以澄清一下吗?

Why Program Runs even though Compiler Error?

1 个答案:

答案 0 :(得分:5)

Eclipse允许您运行"大多数"你的代码,即使它不能正确编译 - 尽管它通常会提示你。通常,不编译的代码会抛出异常以指示编译失败。

在这种情况下,您永远不会最终调用Subclass.foo,因此您不会看到编译错误异常。

如果您将main的第一行更改为:

Subclass s = new Subclass();

...然后尝试调用已损坏的方法,并且您将获得如下输出:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    This static method cannot hide the instance method from Super

    at sandbox.Subclass.foo(Test.java:18)
    at sandbox.Test.main(Test.java:7)

我个人强烈建议你点击"取消"当你尝试运行某些东西时,Eclipse告诉你它有一个编译时错误。如果您之前点击过"总是在没有询问的情况下启动"你需要进入你的偏好并在"启动"更改"如果项目包含错误,则继续启动"来自"始终"到"提示"。 (文本可能已经改变;我使用相当旧版本的Eclipse。)