Java Multi-Catch/Rethrow

Joh*_*0te 3 java exception-handling

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

重新抛出的异常是否会保留最初进入catch子句的异常类型?如果我捕获3种异常(包括基本"异常"类)会怎样 - 它是否始终保持列表中最具体的异常?

Jon*_*eet 7

重新抛出的异常是否会保留最初进入catch子句的异常类型?

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


Rav*_*yal 5

重新抛出的异常是否会保留最初进入catch子句的异常类型?

重新抛出的异常将保持自己的异常类型无关紧要,其中指定了异常类型,使其进入catch子句.

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

这只是你使用异常引用不同类型(取决于你如何定义你的catch块)指向同一个异常对象.