Java Multi-Catch / Rethrow

时间:2015-02-11 16:32:49

标签: 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;
}

重新抛出的异常是否会保留最初进入catch子句的异常类型?如果我捕获3种异常,包括基数"异常" class - 它是否始终是列表中最具体的一个?

2 个答案:

答案 0 :(得分:7)

  

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

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

答案 1 :(得分:5)

  

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

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

说,您使用ArrayIndexOutOfBoundsException指定的catch阻止了Throwable个例外。现在,即使您通过Throwable 引用重新抛出此异常,您也可以catch再次ArrayIndexOutOfBoundsException(在堆栈的上方)catch(或任何其超类类型)因为异常对象本身从未丢失其类型

只是您正在使用不同类型的异常引用(取决于您定义{{1}}块的方式)指向相同的异常对象。