Checked Exception覆盖java

时间:2013-10-04 20:53:26

标签: java scjp

当我的Master类抛出一个已检查的异常时,override方法也不应该实现已检查的异常??

class Master{
    String doFileStuff() throws FileNotFoundException{
        return "a";
    }
}

public class test extends Master{

    public static void main(String[] args){
    }


    String doFileStuff(){
        return "a";
    }

}   

5 个答案:

答案 0 :(得分:0)

覆盖方法应该保留相同的合同。

基本上这意味着它可以抛出FileNotFoundExceptionFileNotFoundException的子类列表,但它不需要。

检查此示例:

Master a = new test();
a.doFileStuff(); //this line might throw an exception, and you should catch it.
                 //but it is not illegal for test class not to throw an exception

现在,我们可以使用FileNotFoundException的子类执行相同的操作,并使用与FileNotFoundException不同的其他异常执行相同的操作。对于后面这种情况,我们将看到我们的代码甚至不会编译,因为doFileStuff类中的test方法抛出不是FileNotFoundException的不同检查异常是非法的。

答案 1 :(得分:0)

覆盖方法时,可以声明所有异常,异常子集或超类方法抛出的异常。您还可以声明任何异常,它是超类方法声明的异常的子类。

除非是超类方法声明的异常的子类,否则不能抛出超类方法未声明的任何异常。

答案 2 :(得分:0)

不是真的,只是为了在代码中显示Admit评论的原因

当您实际有获取它们的风险时可能会抛出异常,如果您的代码中有某个地方throw new FileNotFoundException();您被迫添加try catch或抛出异常。但是,如果您要覆盖,那么您可以删除威胁,如果添加一些新风险,则必须使用新方法处理它们。

import java.io.FileNotFoundException;

class Master {
  String doFileStuff() throws FileNotFoundException {
    throw new FileNotFoundException(); // it always throws an exception.
  }
}

public class Test extends Master {

  public static void main(String[] args) {
    String a = new Test().doFileStuff();
    String b = new Master().doFileStuff();
  }

  String doFileStuff() {
    return "a"; //It always returns a. No risks here.
  }

}

答案 3 :(得分:0)

重写方法没有必要重新声明超类方法抛出的所有Exception。只需要它不会声明Exception被抛出超类方法不会抛出

JLS第8.4.8.3节阐述:

  

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

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

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

  •   
  • 如果m的未删除的throws子句不包含超类型   n的throws子句中的每个异常类型,一个编译时   发生未经检查的警告。

  •   

这是有道理的。为什么应该一个子类方法可能抛出与它重写的超类方法相同的Exception?它不会声明其他异常是有道理的,因为这会破坏这种情况:

public class Super
{
   public void method() throws FooException {}
}

public class Sub extends Super {
{
   public void method() throws FooException, BarException {}
}

然后用法变得不清楚:

Super sup = new Sub();
try {
   sup.method();
}
// But the subclass could (if it were allowed here)
// throw BarException!
catch (FooException e) {}  

答案 4 :(得分:0)

它在子类中是可选的,请查看以下链接:

http://www.tutorialspoint.com/java/java_overriding.htm