为什么抛出异常的方法的调用者不必在这种情况下处理异常?

时间:2014-12-19 11:52:41

标签: java exception interface exception-handling try-catch

考虑以下界面:

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()的调用者不必处理或声明异常,但程序运行成功。为什么会这样? 是否违反了规则,即每当您调用抛出异常的方法时,您需要捕获异常或声明您自己抛出异常?

2 个答案:

答案 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);否则,编译时   发生错误。

意味着扩展方法只能有更强的异常策略。如果它有一个较弱的限制,那么不能使用这种方法代替基本方法,它会破坏覆盖的概念。