【问题标题】:why java can run with a compile time error in eclipse为什么java可以在eclipse中运行时出现编译时错误
【发布时间】:2013-08-05 20:40:43
【问题描述】:
    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()

【问题讨论】:

  • 这是不可能的。我假设你的类路径中有一个旧的class B,它是针对旧版本的interface 编译的。
  • @UwePlonus 它只是在项目中使用一个文件进行的测试。
  • 你没有实现导致编译错误的方法g(),并且很可能在你执行你的类时,它正在执行最后一个成功编译的版本

标签: java eclipse methods interface


【解决方案1】:

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,那么您将永远不会看到此错误。

【讨论】:

    【解决方案2】:

    Eclipse 允许您在运行代码时出现编译时错误 - 在向您发出警告并为您提供退出选项(您通常应该选择)之后。

    如果您尝试调用 tmp.g(),您将收到一个异常,指示编译时失败。

    偶尔运行未完全编译的代码可能很有用 - 特别是如果编译时失败与您实际希望运行的代码无关,例如进行单元测试时 - 但我会非常小心您如何使用此功能。

    【讨论】:

    • 什么。这似乎有点令人讨厌的魔法......为什么 Eclipse 支持这个?
    • 另外,此功能是否记录在任何地方?
    • 另外,这个答案也解决了this other question,没有人能完全弄清楚发生了什么。
    • @nneonneo:Eclipse 通常会弹出一个大对话框,警告您是这种情况。我不记得曾经在没有意识到的情况下这样做过。
    • 可以禁用该对话框,例如在您第一次看到它时打勾。之后就再也不会提示了,代码运行的时候会有点神秘。
    猜你喜欢
    • 2016-10-04
    • 2011-12-17
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    相关资源
    最近更新 更多