e是Exception类型,但在以下代码中显示Exception1:
class Exception1 extends IOException {void info(){}} class Exception2 extends Exception {} class TestMultiCatch { public static void main(String args[]) { try { int a = 10; if (a <= 10) throw new Exception1(); else throw new Exception2(); } catch (Exception1 | Exception2 e) { e.info(); //line 1 error "The method info() is undefined for type Exception" System.out.println(e); //prints Exception1 (after commenting line 1) } } }
根据我的研究,“ e”应为Exception类型,它是Exception1和Exception2的通用基类。从第1行的消息可以明显看出这一点。
但是为什么:
System.out.println(e); //prints Exception1 and not Exception System.out.println(e instanceof IOException); //prints true and not false System.out.println(e instanceof Exception1); //prints true and not false System.out.println(e instanceof Exception2); //false
?谢谢。
当您使用 多catch子句 (的Exception1 | Exception2 e形式catch),在编译时类型e是最大的类型两种类型的共同点,因为课程的代码必须处理两种类型exception.From的规范:
Exception1 | Exception2 e
catch
e
异常参数可以将其类型表示为单个类类型或两个或多个类类型的并集(称为替代)。联合的选择在句法上用分隔|。 将异常参数表示为单个类类型 的catch子句 称为 uni-catch子句 。 一个其异常参数表示为类型并集的 catch子句 称为 multi-catch子句 。 … 异常参数的声明类型为,表示其类型为与替代的D1 | D2 | ... | Dn并集lub(D1, D2, ..., Dn)。
异常参数可以将其类型表示为单个类类型或两个或多个类类型的并集(称为替代)。联合的选择在句法上用分隔|。
|
将异常参数表示为单个类类型 的catch子句 称为 uni-catch子句 。
一个其异常参数表示为类型并集的 catch子句 称为 multi-catch子句 。
…
异常参数的声明类型为,表示其类型为与替代的D1 | D2 | ... | Dn并集lub(D1, D2, ..., Dn)。
D1 | D2 | ... | Dn
lub(D1, D2, ..., Dn)
…其中lub定义的最小上界这里。
lub
如果您想使用特定于Exception1或的任何内容Exception2,请使用单独的catch块:
Exception1
Exception2
} catch (Exception1 e) { // Something using features of Exception1 } catch (Exception2 e) { // Something using features of Exception2 }
如果和info同时存在,则对其进行重构,以使其存在于它们的共同祖先类中:Exception1``Exception2``info
info
Exception1``Exception2``info
class TheAncestorException extends Exception { public void info() { // Or possibly make it abstract // ... } } class Exception1 extends TheAncestorException { // Optionally override `info` here } class Exception2 extends TheAncestorException { // Optionally override `info` here }
…因此编译器可以指定e类型TheAncestorException并使其info可访问。
TheAncestorException