如果我在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 - 它是否始终是列表中最具体的一个?
答案 0 :(得分:7)
重新抛出的异常是否会保留最初进入catch子句的异常类型?
是 - 它将重新抛出完全相同的异常对象。您需要区分{em>编译时类型的ex
(实际上是声明类型的上限)和执行时类型的值ex
,它是对特定对象的引用。对象的类型不会因为你已经发现异常而改变。
答案 1 :(得分:5)
重新抛出的异常是否会保留最初进入catch子句的异常类型?
重新抛出的异常将保持其自己的异常类型无关,指定了哪个异常类型使其进入catch
子句。
说,您使用ArrayIndexOutOfBoundsException
指定的catch
阻止了Throwable
个例外。现在,即使您通过Throwable
引用重新抛出此异常,您也可以catch
再次ArrayIndexOutOfBoundsException
(在堆栈的上方)catch
(或任何其超类类型)因为异常对象本身从未丢失其类型。
只是您正在使用不同类型的异常引用(取决于您定义{{1}}块的方式)指向相同的异常对象。