考虑以下界面:
package hf;
public interface BadInterface
{
void meth() throws Exception;
}
由以下类实现:
package hf;
public class apples implements BadInterface
{
public static void main(String[] args)
{
new apples().meth();
}
public void meth()
{
System.out.println("Ding dong meth.");
}
}
尽管meth()是抛出异常的方法,但方法meth()的调用者不必处理或声明异常,但程序运行成功。为什么会这样? 是否违反了规则,即每当您调用抛出异常的方法时,您需要捕获异常或声明您自己抛出异常?
答案 0 :(得分:7)
实现接口方法时,可以声明抛出较少的异常,而不是接口中列出的异常。
当您致电new apples().meth()
时,您正在meth()
个实例上调用apples
。编译器知道这不会抛出任何东西,所以你没事。
你做完了:
BadInterface foo = new apples(); // Note: should be Apples (code style)
foo.meth();
然后你需要捕获接口中声明的异常,因为编译器只知道它正在处理BadInterface
实例。
答案 1 :(得分:0)
根据JLS Requirements in Overriding and Hiding:
B是类或接口,A是B的超类或超接口,B中的方法声明m2覆盖或隐藏A中的方法声明m1。然后:
对于m2的throws子句中列出的每个已检查异常类型, 必须出现相同的异常类或其中一个超类型 m1的throws子句的擦除(§4.6);否则,编译时 发生错误。
意味着扩展方法只能有更强的异常策略。如果它有一个较弱的限制,那么不能使用这种方法代替基本方法,它会破坏覆盖的概念。