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()
Eclipse 允许您运行带有编译时错误的代码 - 在给您警告并为您提供退出选项(您通常应该采取(之后。
如果尝试调用tmp.g()
将收到指示编译时失败的异常。
有时运行未完全编译的代码可能很有用 - 特别是如果编译时失败与您实际希望运行的代码无关,例如在单元测试时 - 但我会非常小心你如何使用这个功能。
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
,那么您将永远不会看到此错误。