为什么说:"Checked exceptions are not forwarded in calling chain (propagated)"?
Why is it said: "Checked exceptions are not forwarded in calling chain (propagated)"?
对于未经检查的(运行时)异常是可以理解的。它们实际上是通过堆栈传播的。但是为什么说checked exceptions不是呢?是的,我们要declare(throws)或者handle它们(try-catch),但是为什么不叫'propagating'在这个案例?让我给你举个基本的例子:
public class Main {
void m() throws IOException {
throw new java.io.IOException("device error");//checked exception
}
void n() throws IOException {
m();
}
void p(){
try{
n();
}catch(Exception e){System.out.println("exception handled");}
}
public static void main(String args[]){
new Main().p();
}
}
在我看来,我刚刚做了一个 'chaining',效果很好。那么为什么文档说“默认情况下不传播检查”?
checked 和 unchecked 异常在运行时的行为实际上没有任何区别。
已检查的异常只是所有异常的一个子集,编译器决定查看它们并查看它们是显式声明为抛出还是捕获。如果不是,那就是错误。
如果你能以某种方式hack the compiler to skip this check,它的行为与运行时完全一样。
鉴于运行时语义相同,说一个传播而另一个不传播是没有意义的。
by default checked are not propagated
我相信这是 here。
这是一个不寻常的术语。
我怀疑那句话的意思是你不能只写:
void m() {
throw new IOException("device error");//checked exception
}
void n() {
m();
}
void p(){
try{
n();
}catch(Exception e){System.out.println("exception handled");}
}
因为异常没有从m()
“传播”到n()
再到p()
,因为它是一个已检查的异常,所以这段代码甚至无法编译。
如果它是未经检查的异常,它将被此代码从 m()
“传播”到 n()
再到 p()
。
您必须显式传播异常,如果这是您想要的:
void m() throws IOException { ... }
void n() throws IOException { m(); }
这种传播的替代方法是在方法内部处理它。关键是,你必须选择用它做什么。
对于未经检查的(运行时)异常是可以理解的。它们实际上是通过堆栈传播的。但是为什么说checked exceptions不是呢?是的,我们要declare(throws)或者handle它们(try-catch),但是为什么不叫'propagating'在这个案例?让我给你举个基本的例子:
public class Main {
void m() throws IOException {
throw new java.io.IOException("device error");//checked exception
}
void n() throws IOException {
m();
}
void p(){
try{
n();
}catch(Exception e){System.out.println("exception handled");}
}
public static void main(String args[]){
new Main().p();
}
}
在我看来,我刚刚做了一个 'chaining',效果很好。那么为什么文档说“默认情况下不传播检查”?
checked 和 unchecked 异常在运行时的行为实际上没有任何区别。
已检查的异常只是所有异常的一个子集,编译器决定查看它们并查看它们是显式声明为抛出还是捕获。如果不是,那就是错误。
如果你能以某种方式hack the compiler to skip this check,它的行为与运行时完全一样。
鉴于运行时语义相同,说一个传播而另一个不传播是没有意义的。
by default checked are not propagated
我相信这是 here。
这是一个不寻常的术语。 我怀疑那句话的意思是你不能只写:
void m() {
throw new IOException("device error");//checked exception
}
void n() {
m();
}
void p(){
try{
n();
}catch(Exception e){System.out.println("exception handled");}
}
因为异常没有从m()
“传播”到n()
再到p()
,因为它是一个已检查的异常,所以这段代码甚至无法编译。
如果它是未经检查的异常,它将被此代码从 m()
“传播”到 n()
再到 p()
。
您必须显式传播异常,如果这是您想要的:
void m() throws IOException { ... }
void n() throws IOException { m(); }
这种传播的替代方法是在方法内部处理它。关键是,你必须选择用它做什么。