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

为什么Java中的多捕获特性要求异常是最终的?,java,exception,java-7,multi-catch,Java,Exception,Java 7,Multi Catch,added to Java 7上的Oracle文档声明,catch子句中的异常参数隐式地为final 我的问题是:这样的限制有什么意义?因为我似乎找不到它带来的任何关键改进。将引用对象标记为final只会保护引用本身不被修改,而不会保护它引用的对象,并且永远不会禁止创建另一个引用并以任何方式修改它 A讨论了为什么修改catch子句中的异常引用不是最明智的做法,但它涉及到catch子句的任何使用,而不仅仅是它的多捕获形式。那么,为什么Java要为多重捕获创建一个异常,并以特殊的方式处理它呢?在un

added to Java 7上的Oracle文档声明,
catch
子句中的异常参数隐式地为
final

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


A讨论了为什么修改
catch
子句中的异常引用不是最明智的做法,但它涉及到
catch
子句的任何使用,而不仅仅是它的多捕获形式。那么,为什么Java要为多重捕获创建一个异常,并以特殊的方式处理它呢?

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

通常不能为具有类型联合的变量赋值太多。我假设这与多catch中的类型不明确这一事实有关。在你所链接的问题中给出解释。@SotiriosDelimanolis,如果你的解释是指“讨论明显的不一致性没有太大意义……除非你打算设计和实现一种新的语言”,那么我不同意。了解某个语言结构背后的逻辑有助于理解语言设计者的思维方式,这有助于以更恰当和惯用的方式使用该语言。不,另一方面,允许修改多异常捕获会引入真正奇怪和混乱的代码,例如:。