重写方法没有必要重新声明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) {}