gpt4 book ai didi

java - Java 的已检查异常处理是否已损坏?

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:07 25 4
gpt4 key购买 nike

来自 java.lang.Exception 类的 javaDocs:

Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.

但是考虑一下这段代码:

package other;

public class CheckedExceptionHandling {

private static <E extends Exception> void throwException() throws E {
throw (E) new CheckedException2(); // unchecked cast warning
}

private static void setUncaughtExceptionHandler() {
Thread.currentThread().setUncaughtExceptionHandler((t, e) -> {
System.out.println("Unhandled exception: " + e.getClass()); // reports CheckedExceptionHandling$CheckedException2
});
}

public static void main(String[] args) /* no checked exceptions declared! */ {
setUncaughtExceptionHandler();
try {
CheckedExceptionHandling.<CheckedException1>throwException();
} catch (CheckedException1 e) {
System.out.println(e); // never gets here
}
}
// checked exceptions:
public static class CheckedException1 extends Exception {}
public static class CheckedException2 extends Exception {}

}

编译时出现警告,运行时结果为:

Unhandled exception: class other.CheckedExceptionHandling$CheckedException2

我预计会出现编译时错误 unreported exception CheckedException2;必须捕获或声明为抛出不兼容的类型:CheckedException2 无法在运行时转换为 CheckedException1 或至少是 ClassCastException
但是编译器允许未处理、未声明的已检查异常在方法main 之外传播到未捕获的异常处理程序
为什么?我在这里遗漏了什么吗?

最佳答案

问题是编译器没有查看方法边界。在 throwsException() 中,除了“扩展异常”之外没有关于 E 的信息,因此编译器无法证明转换是错误的并给出警告,而不是错误(正如 Marko 已经在评论中指出的那样)。

在 main() 中,编译器只看到“throwsException”的签名,它被定义为“throws E”,在 main() 中,E 是 CheckedException。当捕获到 CheckedException 时,这里一切正常。

然后,Java 在编译时丢弃所有泛型类型信息,因此字节码中不存在对 E 的转换。因此,运行时也无法检测到类型错误。

这里被破坏的不是异常处理,而是类型系统。

关于java - Java 的已检查异常处理是否已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com