Java异常和throw子句

时间:2015-02-21 09:26:59

标签: java exception

8.4.8.3子句中的JLS提到了有关包含throws子句的覆盖方法,但目前还不清楚他们试图用什么来表达:

  

更确切地说,假设B是类或接口,A是a   B的超类或超接口,以及B中的方法声明m2   覆盖或隐藏A中的方法声明m1。然后:

     
      
  • 如果m2有一个throws子句,提到任何已检查的异常类型,   那么m1必须有一个throws子句,否则就会发生编译时错误。
  •   

什么类型的已检查异常m2应放入其throws子句?

3 个答案:

答案 0 :(得分:3)

代码中的示例:

class B implements A {

  @Override
  void m() throws SomeException {
    /* ... */
  }
}

什么是不允许的:

interface A {

  void m(); // This is not allowed
}

允许什么:

interface A {

  void m() throws SomeException;
}

甚至:

interface A {

  void m() throws Exception;
}

编辑:

你引用的第二个要点:

  
      
  • 对于m2的throws子句中列出的每个已检查异常类型,   必须出现相同的异常类或其中一个超类型   m1的throws子句的擦除(§4.6);否则,编译时   发生错误。
  •   

答案 1 :(得分:1)

它说,如果你的子类抛出检查异常,那么父进程不会导致编译时错误。

考虑一下:

class A {
    public void testMethod() {}
}

class B extends A {
    public void testMethod() throws FilNotFoundException {}
}

这会抛出编译时错误。进一步说,要解决这个问题,你可能需要父方法来抛出FileNotFoundException。

答案 2 :(得分:0)

  

什么类型的已检查异常m2应该抛出其throws子句?

m2只能throws超类中重写方法的throws子句中的全部或部分异常类。

例如:

class Base                     
{
    void amethod() { }
}

class Derv extends Base
{
    void amethod() throws Exception { } //compile-time error
}