在 Java 7 多通道块中,捕获的异常的类型是什么?

2022-09-01 14:22:20

在 Java 7 多通道块中,如下所示:

try {
    // code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
    // handle exception
}

的编译时类型是什么?它是两种异常类型共有的最派生的类吗?在此示例中,这将是一个 .exIOException


答案 1

是的,的类型是 两者中最具体的超类型,并且 ,这将是 。exCharacterCodingExceptionUnknownServiceExceptionIOException

编辑:直接从马的嘴里 http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html#multi_catch

非正式地说,lub(最小上限)是所讨论类型的最具体的超类型。


答案 2

在 JSL 7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20-510 中

§14.20 > 异常参数的声明类型,表示其类型为与备选项 D1 |D2 |... |Dn 是 lub(D1, D2, ..., Dn) (§15.12.2.7)。

最小上限的定义非常复杂。幸运的是,我们在这里谈论的类型通常只是Shrewable的非泛型子类,并产生最具体的超类。lub()lub()

对于更复杂的情况,请考虑

class E1 extends Exception implements G<A>
class E2 extends Error implements G<B>

lub(E1, E2) = Throwable & G<?>