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

Sem*_*nic 11 java exception java-7 multi-catch

关于添加到Java 7 的多捕获功能的Oracle文档声明该catch子句中的异常参数是隐式的final.

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

关于SO的一个有点相关的问题讨论了为什么修改catch子句中的异常引用不是最明智的事情,但它涉及到该子句的任何使用catch,而不仅仅是它的多捕获形式.那么为什么Java会为多重捕获制造一个例外,并以特殊的方式对待它?

谢谢!

man*_*uti 19

在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();
}
Run Code Online (Sandbox Code Playgroud)

编译器确定抛出的对象是类型的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();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器不知道哪种类型的例外是在编译时间,所以分配一个新的IOException到可引用变量或者一个IOExceptionParseException不应该被允许.除此之外,缺少用于首先分配异常变量的用例.因此,隐式地创建变量final并避免所有这些混淆是完全合理的.如果您确实需要分配给变量,则可以切换到编写catch块序列的旧方法.