【发布时间】:2023-03-20 02:11:01
【问题描述】:
以下代码完美编译。我相信这是因为编译器在编译时知道控件将转到 finally 块并抛出未经检查的异常(这没关系,不需要处理)并且它知道代码之前抛出的所有其他异常至此都迷失了。所以不用担心他们。
try{
// DoSomething();
}catch(Exception e){
// Throw checked exception
}finally{
// Throw unchecked exception
}
示例:
public class TestClass {
public static void main(String[] args) {
TestClass c = new TestClass();
try {
// Whatever
} catch (Exception e) {
throw new FileNotFoundException();
} finally {
throw new NullPointerException();
}
}
}
到目前为止一切顺利,直到我从方法中抛出未经检查的异常。
try{
// DoSomething();
}catch(Exception e){
// Call a method that throws a checked exception
// or just throw the checked exception from here
}Finally{
// Call a method that throw an unchecked exception
}
示例:
public class TestClass {
public static void main(String[] args) {
TestClass c = new TestClass();
try {
//Whatever
} catch (Exception e) {
c.m1();
// or just throw it here
// throw new FileNotFoundException();
} finally {
c.m2();
}
}
public void m1() throws IOException {
throw new FileNotFoundException();
}
public void m2() throws RuntimeException {
throw new NullPointerException();
}
}
此代码将无法编译。它将 c.m1() 标记为错误“未处理的异常类型 _”(eclipse)或“未报告的异常 _;必须捕获或声明为抛出”(cmd)。
就像它忽略了 finally 块将抛出 LAST 异常(未检查),即使它是未处理的检查异常,也无需担心 catch 块中的异常,因为它们无论如何都会丢失!知道 m2() 被声明为专门抛出未经检查的异常 (RuntimeException)。
有没有人更好地解释为什么第二个代码中存在编译错误? 谢谢:)
【问题讨论】:
-
编译器无法处理这种情况。你能说说为什么你会这样写代码吗?
-
我实际上并没有编写任何代码。我只是在学习一些关于已检查和未检查异常的基础知识,以及编译器如何表现和检查异常。我想到了这种情况,我想问问有人有什么想法。我会试着想一个真实的例子,但正如你所说,编译器似乎无论如何都不会处理这种情况。
标签: java exception-handling compile-time try-catch-finally unchecked-exception