为什么Java可以在Eclipse中出现编译时错误但仍能运行

4
    interface A
    {
        public void f();
        public void g();
    }


   class B implements A
   {
       public void f() 
       {
            System.out.println("B.f()");
       }
   }

   public class Main 
   {
       public static void main(String[] args) 
       {
            B tmp = new B();
            tmp.f();
            System.out.println("B.f()");
       }
   }

我没有在B中实现接口A的所有方法,而且它出现了一个错误。
    The type B must implement the inherited abstract method A.g()

但为什么它能够得到这个输出呢?
    B.f()
    B.f()

这是不可能的。我认为您的类路径中有一个旧的 B 类,它是针对旧版本的 接口 进行编译的。 - Uwe Plonus
@UwePlonus 这只是一个测试,项目中只有一个文件。 - CLS
你没有实现方法 g(),这会导致编译错误。很可能当你执行你的类时,它会执行最后一个成功编译的版本。 - user902383
2个回答

3
Eclipse允许你在编译时存在错误的情况下运行代码 - 在警告并提供回退选项后(通常应该选择回退)。
如果你试图调用tmp.g(),你将会得到一个示意编译时失败的异常。
偶尔地,运行不完全编译的代码也可能有用 - 特别是当编译时失败与你实际想要运行的代码无关时,比如单元测试 - 但是我非常谨慎地使用这个功能。

什么?那似乎有点不好的魔法...为什么Eclipse支持这个? - nneonneo
@nneonneo:Eclipse通常会弹出一个大对话框警告你这种情况。我记不得曾经在没有意识到的情况下这样做过。 - Jon Skeet
可以禁用该对话框,例如在首次看到它时勾选该框。之后,您将不会再收到提示,当您的代码运行时,这可能会有点神秘。 - nneonneo
我怀疑一个不警觉的用户可能没有仔细阅读提示框,认为“我不想每次启动都要确认!”,并愉快地勾选禁用警告框。也许应该更难禁用该警告(例如需要进入首选项)。 - nneonneo
@nneonneo:是的,我同意这一点 - 而且重新启用它可能会更容易。 (我总是很难找到重新启用禁用对话框的方法...) - Jon Skeet
显示剩余3条评论

2
Eclipse可以“修补”某些类型的编译错误,并在存在错误的情况下运行程序。通常,你会得到一个对话框,上面写着以下内容:
错误存在于必需的项目中: (项目名称) 继续启动吗? [X] 始终无需询问
如果你选择“继续”,或者你已经禁用了对话框,Eclipse将尽可能修复编译错误。如果你尝试运行受编译错误影响的代码,你将得到一个运行时异常。
在这种情况下,Eclipse添加了一个虚拟的B.g()方法,只包含以下内容:
throw new java.lang.Error("Unresolved compilation problem: \n"
"The type B must implement the inherited abstract method A.g()");

通过插入这个虚拟方法,代码将可以正确编译并运行。如果您从未调用B.g,那么您将永远不会看到此错误。


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