assylias很好地解释了final rethrow。
我将final添加到method3
。
public void method4() throws IOException {
try {
throw new IOException("1");
} catch (final Exception e) {
e = new IOException("2"); //does not compile
throw e; //does not compile
}
}
我将编译器设置为1.7。 method4
有两个编译错误:
final exception can neither be reassigned nor throw precise exception.
那么,显式最终异常仅用于防止修改?
答案 0 :(得分:0)
Exception
隐式final
并不意味着你无法重新分配它。如果您专门设置它final
,那么编译器将不允许您修改该引用。要使throw
编译异常实例必须为final
或有效 final
,如链接答案中所述。
public void method4() throws IOException {
try {
throw new IOException("1");
} catch (final Exception e) {
e = new IOException("2");// You can not modify final reference
throw e;
}
}
所以显式最终异常仅用于防止修改?
确切地说,如果发生异常,final
修饰符是多余的。始终建议throw
或log
例外。根据我的说法,任何异常的修改都是反模式。一般来说,即使在自定义异常的情况下,我们也不应该修改抛出的异常,除非并且直到你有充分的理由这样做。