抛出部分并不表示该方法需要抛出所提到的异常,即使在特定的位置也是如此.它只告诉该函数允许这样做.
因此包含throws UnsupportedOperationException并不意味着该方法不受支持.除了UnsupportedOperationException之外还有一个RuntimeException,所以无论如何方法都可以抛出它.
现在因为在方法的签名中需要它,它归结为完全检查异常的能力.为了使编译器能够确定方法是否只能抛出指定的异常,它必须能够确定它调用的方法不能抛出未捕获的异常.
这意味着,例如,覆盖方法意味着您无法添加可能引发的异常,否则您将无法验证调用该方法的方法是否不会抛出除指定之外的任何内容.另一种方式是可能的(但我不确定Java是否支持),覆盖一个可能抛出一个可能不抛出的方法.
例如:
class B {
int fubar(int) throws ExceptionA {
}
int frob(int) throws ExceptionA {
return fubar(int);
}
}
class D extends B {
int fubar(int) throws ExceptionB {
}
}
现在指定frob可能只抛出ExceptionA,但是在调用this.fubar时它会打开抛出其他内容的可能性,但是fubar被定义为可能只抛出ExceptionA.这就是为什么D.fubar是一个无效的覆盖,因为这会打开this.fubar实际抛出ExceptionB的可能性,编译器将无法保证frob不会抛出ExceptionB.