Dar*_*usz 13 java exception try-catch java-7 multi-catch
我建造了一些我不太懂的东西 - 我不知道它是如何工作的.我已经熟悉了这篇关于多篇解释的文章.
考虑这两个例外和代码:
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
}
Run Code Online (Sandbox Code Playgroud)
我将无法调用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 /*...*/
Run Code Online (Sandbox Code Playgroud)
并将其添加到两个异常中,Java实际上能够允许我使用该方法.然后调用它是有效的:
try {
//...
} catch (MyException1|MyException2 e) {
e.getCustomValue(); // does work
}
Run Code Online (Sandbox Code Playgroud)
简而言之,我的问题是:这里实际发生了什么:(MyException1|MyException2 e).
什么是e?
是否选择最接近的超类e?这个问题询问了这个问题,据说是答案.如果是这样,那么当我访问e时,为什么界面CustomValueGetter"可见"?在我的情况下,不应该e是一个Exception.
如果没有,如果真正的类是MyException1或者MyException2为什么我不能简单地为这两个类调用相同的方法?
是e一个动态生成的类的实例,它实现了两个异常的所有公共接口,并且是最近的常见超类类型?
正如 Ischuetze 所说,e 正在寻找两个异常共享的类或接口。在 can\xc2\xb4t 中的第一个示例中,尽管存在 Exception 类,但仍找到一个共享类,因此它只能使用它提供的方法。
\n\n将您的示例更改为此代码将能够再次编译。
\n\npublic class MyException12 extends Exception {\n public String getCustomValue(){ return "boo"; };\n}\n\npublic class MyException1 extends MyException12{\n public String getCustomValue() { return "foo"; };\n}\n\npublic class MyException2 extends MyException12{\n // constructors, etc\n public String getCustomValue() { return "foo"; };\n}\nRun Code Online (Sandbox Code Playgroud)\n\n正如在接口示例中一样,异常通知MyException1和都MyException2具有MyException12,因此能够使用 it\xc2\xb4s 函数。
这是一个回答整个问题以及 e 的类型的问题。
\n\n引用答案中的链接:
\n\n\n\n更改异常类型的处理方式会以两种方式影响类型系统:除了对所有类型执行通常的类型检查之外,异常类型还会进行额外的编译时分析。出于类型检查的目的,使用析取声明的 catch 参数的类型为 lub(t1, t2, ...) (JLSv3 \xc2\xa715.12.2.7),其中 ti 是 catch 子句声明到的异常类型处理。非正式地,lub(最小上限)是所讨论类型中最具体的超类型。在多捕获异常参数的情况下,所讨论的类型的最小上限始终存在,因为所有捕获的异常的类型必须是 Throwable 的子类。因此,Throwable 是所讨论类型的上限,但它可能不是最小上限,因为 Throwable 的某些子类可能是所讨论类型的超类(因此也是超类型),并且所讨论的异常类型可能是实现一个通用接口。(lub 可以是超类和一个或多个接口的交集类型。)出于异常检查 (JLSv3 \xc2\xa711.2) 的目的,需要使用一个 throw 语句 (JLSv3 \xc2\xa711.2.2) 来重新抛出最终异常或有效地最终 catch 参数被视为抛出精确的异常类型:
\n
| 归档时间: |
|
| 查看次数: |
437 次 |
| 最近记录: |