В многосекундном блоке Java 7 какой тип пойманного исключения?
В многозадачном блоке Java 7, таком как:
try {
// code that throws exception
} catch (CharacterCodingException | UnknownServiceException ex) {
// handle exception
}
каков тип времени компиляции ex
? Является ли это наиболее производным классом, который имеет оба типа исключений? В этом примере это будет IOException
.
Ответы
Ответ 1
Да, тип ex
- это самый конкретный супертип как CharacterCodingException
, так и UnknownServiceException
, который был бы IOException
.
Изменить: Прямо от устья лошади на 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).
Определение lub()
, т.е. наименьшая верхняя граница является довольно запутанной. К счастью, типы, о которых мы говорим, обычно представляют собой просто не общие подклассы Throwable, а lub()
дает наиболее специфический суперкласс.
Для более сложного случая рассмотрим
class E1 extends Exception implements G<A>
class E2 extends Error implements G<B>
lub(E1, E2) = Throwable & G<?>