【发布时间】:2015-11-21 09:26:56
【问题描述】:
我构建了一些我不太了解的东西 - 我不知道它是如何工作的。我已经熟悉了这个multicatch explaination article。
考虑这两个异常和代码:
public class MyException1 extends Exception {
// constructors, etc
String getCustomValue();
}
public class MyException2 extends Exception {
// constructors, etc
String getCustomValue() { return "foo"; }
}
try {
//...
} catch (MyException1|MyException2 e) {
e.getCustomValue(); // won't work, as I expected
}
即使方法相同,我也无法调用getCustomValue(),因为在Java 内部,上面的try/catch 应该实际上将MyException1/2 转换为Exception(这就是我的理解文档)。
但是,如果我引入这样的界面:
public interface CustomValueGetter {
String getCustomValue();
}
public class MyException1 extends Exception implements CustomValueGetter /*...*/
public class MyException2 extends Exception implements CustomValueGetter /*...*/
并将其添加到两个异常中,Java 实际上能够允许我使用该方法。然后调用它是有效的:
try {
//...
} catch (MyException1|MyException2 e) {
e.getCustomValue(); // does work
}
简而言之,我的问题是:这里实际发生了什么:(MyException1|MyException2 e)。
什么是e?
是否选择了最接近的超类作为
e的类型? This question asks about it 应该就是答案。如果是这样,那么当我访问 e 时,为什么接口 CustomValueGetter “可见”?在我的情况下,e不应该是Exception。如果不是,如果真正的类是
MyException1或MyException2,为什么我不能简单地调用对这两个类可用的相同方法?e是动态生成的类的实例吗?它实现了两个异常的所有通用接口并且是最接近的通用超类类型?
【问题讨论】:
标签: java exception try-catch java-7 multi-catch