添加到Java 7的multi-catch feature上的Oracle文档指出catch
子句中的exception参数隐式final
。
我的问题是:这种限制的重点是什么?因为我似乎无法找到它带来的一个重要改进。将引用对象标记为final
仅保护引用本身不被修改,而不是它引用的对象,并且永远不会禁止创建另一个引用并以任何他们想要的方式修改它。
A somewhat relevant question on SO讨论了为什么修改catch
子句中的异常引用不是最明智的事情的原因,但它与对任何的使用有关{{3}} 1}}子句,而不仅仅是它的多捕获形式。那么为什么Java会为多重捕获做出一个例外,并以特殊的方式对待它?
谢谢!
答案 0 :(得分:15)
在uni-catch子句中,您可以自由地重新分配异常对象。例如,这很好用:
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException) {
e = new IOException(); // this is acceptable (although there is no point in doing it)
e.printStackTrace();
}
编译器确定抛出的对象是IOException
类型。
但是,在multi-catch子句中,您可以使用以下内容:
try {
... // code that can throw IOException or some user-defined ParserException
} catch(IOException | ParserException e) {
e = new IOException(); // this is NOT acceptable -- e may reference a ParserException
e.printStackTrace();
}
在这种情况下,编译器不知道在编译时异常是哪种类型,因此将新的IOException
分配给可以引用的 IOException
的变量或者ParseException
不应该被允许。除此之外,缺少用于首先分配异常变量的用例。因此,使变量隐式final
并避免所有这些混淆是完全合理的。如果您确实需要分配给变量,则可以切换到编写catch
块序列的旧方法。