小编典典

多捕获块中异常问题的引用类型

java

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

?谢谢。


阅读 207

收藏
2020-11-26

共1个答案

小编典典

当您使用 多catch子句 (的Exception1 | Exception2 e形式catch),在编译时类型e是最大的类型两种类型的共同点,因为课程的代码必须处理两种类型exception.From的规范

异常参数可以将其类型表示为单个类类型或两个或多个类类型的并集(称为替代)。联合的选择在句法上用分隔|

将异常参数表示为单个类类型 的catch子句 称为 uni-catch子句

一个其异常参数表示为类型并集的 catch子句 称为 multi-catch子句

异常参数的声明类型为,表示其类型为与替代的D1 | D2 | ... | Dn并集lub(D1, D2, ..., Dn)

…其中lub定义的最小上界这里

如果您想使用特定于Exception1或的任何内容Exception2,请使用单独的catch块:

} catch (Exception1 e) {
    // Something using features of Exception1
} catch (Exception2 e) {
    // Something using features of Exception2
}

如果和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可访问。

2020-11-26