Java Multi-Catch/Rethrow

Java Multi-Catch/Rethrow

如果我在 Java 1.7 中使用 multi-catch 执行以下操作:

catch (ArrayIndexOutOfBoundsException | NullPointerException ex) {
    logger.error("Array out of bounds exception in BatchTableRow constructor: data was: table = " +
            schema.toString() + ", data: " + sourceRow.toString(), ex);
    throw ex;
}

重新抛出的异常会保持原来进入catch子句的异常类型吗?如果我捕捉到 3 种异常,包括基础 "Exception" class 怎么办 - 它是否始终是列表中可用的最具体的异常?

Will the re-thrown exception maintain the exception type that originally entered the catch clause?

是 - 它将重新抛出完全相同的异常对象。您需要区分 excompile-time 类型(这实际上是已声明类型的上限)和 execution-time 类型的值是ex,这是对特定对象的引用。对象的类型不会因为您捕获到异常而改变。

Will the re-thrown exception maintain the exception type that originally entered the catch clause?

重新抛出的异常将保持其 自己的 异常类型,这与指定的异常类型无关,使其进入 catch 子句。

比如说,您用 Throwable 指定的 catch 块捕获了一个 ArrayIndexOutOfBoundsException 异常。现在,即使您通过 Throwable reference 重新抛出此异常,您也可以使用 ArrayIndexOutOfBoundsException 再次 catch 它(在堆栈的上层) (或其任何 超类 类型)因为异常对象本身从未丢失其 type.

只是你使用的异常 references of different types (depending on how you defined your catch block ) 指向 相同的 异常对象。