为什么Java中的多捕获功能需要例外才能最终确定?

2022-09-04 01:19:22

有关添加到 Java 7 的多捕获功能的 Oracle 文档指出,子句中的 exception 参数是隐式的。catchfinal

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

关于SO的一个有点相关的问题讨论了为什么修改子句中的异常引用不是最明智的做法的原因,但它与子句的任何使用有关,而不仅仅是它的多捕获形式。那么,为什么Java会为多重捕获做一个例外,并以一种特殊的方式对待它呢?catchcatch


答案 1

在 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

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();
}

在这种情况下,编译器在编译时不知道异常的类型,因此将 new 分配给可以引用 或 不应允许的变量。除此之外,首先缺乏分配给异常变量的用例。因此,隐式地创建变量并避免所有这些混淆是完全有意义的。如果你真的需要赋值给变量,你可以切换到旧的块序列编写方式。IOExceptionIOExceptionParseExceptionfinalcatch


答案 2