在 Java 7 多通道块中,捕获的异常的类型是什么?
在 Java 7 多通道块中,如下所示:
try {
// code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
// handle exception
}
的编译时类型是什么?它是两种异常类型共有的最派生的类吗?在此示例中,这将是一个 .ex
IOException
在 Java 7 多通道块中,如下所示:
try {
// code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
// handle exception
}
的编译时类型是什么?它是两种异常类型共有的最派生的类吗?在此示例中,这将是一个 .ex
IOException
是的,的类型是 两者中最具体的超类型,并且 ,这将是 。ex
CharacterCodingException
UnknownServiceException
IOException
编辑:直接从马的嘴里 http://cr.openjdk.java.net/~darcy/ProjectCoin/ProjectCoin-Documentation-v0.83.html#multi_catch:
非正式地说,lub(最小上限)是所讨论类型的最具体的超类型。
在 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<?>