0

当我的 Master 类抛出受检异常时,覆盖方法不应该也实现受检异常吗?

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

public class test extends Master{

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


    String doFileStuff(){
        return "a";
    }

}   
4

5 回答 5

0

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

当您实际上有可能获得异常时,可能会抛出异常,如果您的代码中有某个地方,您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.
  }

}
于 2013-10-04T21:04:56.497 回答
0

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

JLS 的第 8.4.8.3 节详细说明:

更准确地说,假设 B 是类或接口,A 是 B 的超类或超接口,B 中的方法声明 n 覆盖或隐藏 A 中的方法声明 m。那么:

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

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

  • 如果 m 的未擦除 throws 子句不包含 n 的 throws 子句中每个异常类型的超类型,则会出现编译时未经检查的警告。

那讲得通。为什么子类方法可能会抛出与Exception它覆盖的超类方法相同的 s?不声明额外的异常是有道理的,因为这会破坏这种情况:

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) {}  
于 2013-10-04T21:05:51.743 回答
0

重写方法时,您可以声明所有异常、异常子集或不声明超类方法抛出的任何异常。您还可以声明作为超类方法声明的异常的子类的任何异常。

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

于 2013-10-04T21:03:27.490 回答
0

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

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

于 2013-10-07T07:16:24.853 回答
0

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

基本上这意味着它可以抛出一个FileNotFoundException或一个子类列表,FileNotFoundException但它不是必须的。

检查这个例子:

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

于 2013-10-04T21:02:39.797 回答