为什么Java中的多捕获功能要求异常是最终的?

时间:2015-02-18 15:29:20

标签: java exception-handling java-7 multi-catch

添加到Java 7的multi-catch feature上的Oracle文档指出catch子句中的exception参数隐式final

我的问题是:这种限制的重点是什么?因为我似乎无法找到它带来的一个重要改进。将引用对象标记为final仅保护引用本身不被修改,而不是它引用的对象,并且永远不会禁止创建另一个引用并以任何他们想要的方式修改它。

A somewhat relevant question on SO讨论了为什么修改catch子句中的异常引用不是最明智的事情的原因,但它与对任何的使用有关{{3}} 1}}子句,而不仅仅是它的多捕获形式。那么为什么Java会为多重捕获做出一个例外,并以特殊的方式对待它?

谢谢!

1 个答案:

答案 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块序列的旧方法。