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()
答案 0 :(得分:3)
Eclipse允许您运行带有编译时错误的代码 - 在给出警告并为您提供退出选项后(通常应该采取此选项)。
如果您尝试调用tmp.g()
,则会收到指示编译时失败的异常。
偶尔运行不能完全编译的代码会很有用 - 特别是如果编译时失败与您实际希望运行的代码无关,例如单元测试时 - 但我会非常小心你如何使用这个功能。
答案 1 :(得分:2)
Eclipse可以“修补”某些类别的编译错误,并且即使存在错误也运行程序。通常,您会看到一个对话框,其中包含以下内容:
所需项目中存在错误:
(项目名称)
继续推出?
[X]始终在不询问的情况下启动
如果选择Proceed,或者如果已禁用该对话框,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
,那么您将永远不会看到此错误。