Java 为什么会这样说:“为什么?”;选中的异常不会在调用链中转发(已传播)“;?
对于未检查的(运行时)异常,这是可以理解的。它们实际上是通过堆栈传播的。但为什么说选中的异常不是?是的,我们必须声明(抛出)或处理它们(尝试捕获),但在这种情况下为什么不称之为“传播”?让我给你举个基本的例子:Java 为什么会这样说:“为什么?”;选中的异常不会在调用链中转发(已传播)“;?,java,exception,chaining,propagation,checked-exceptions,Java,Exception,Chaining,Propagation,Checked Exceptions,对于未检查的(运行时)异常,这是可以理解的。它们实际上是通过堆栈传播的。但为什么说选中的异常不是?是的,我们必须声明(抛出)或处理它们(尝试捕获),但在这种情况下为什么不称之为“传播”?让我给你举个基本的例子: public class Main { void m() throws IOException { throw new java.io.IOException("device error");//checked exception }
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();
}
}
在我看来,我只是做了一个“链接”,效果很好。那么为什么文档会说“默认情况下,已检查的异常不会传播”在运行时,已检查异常和未检查异常的行为实际上没有任何区别 检查异常只是所有异常的子集,编译器决定查看这些异常,并查看它们是否被显式声明为抛出或捕获。如果不是,那就是一个错误 如果可以,它的行为与运行时的行为完全相同
如果运行时语义相同,那么说一个是传播的,另一个不是传播的是没有意义的。在运行时,检查异常和未检查异常的行为实际上没有任何区别 检查异常只是所有异常的子集,编译器决定查看这些异常,并查看它们是否被显式声明为抛出或捕获。如果不是,那就是一个错误 如果可以,它的行为与运行时的行为完全相同 如果运行时语义相同,那么说一个是传播的,另一个不是传播的是没有意义的 默认情况下,选中的复选框不会传播 我相信这一点的根源是 这是一个不同寻常的术语。 我怀疑这句话的意思是你不能只写:
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(); }
这种传播的替代方法是在方法内部处理它。关键是,你必须选择如何处理它
默认情况下,选中的复选框不会传播
我相信这一点的根源是
这是一个不同寻常的术语。
我怀疑这句话的意思是你不能只写:
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(); }
这种传播的替代方法是在方法内部处理它。关键是,你必须选择如何处理它。你能不能也为该声明链接一个来源?是的,请问,你从哪里引用?“我不知道有谁会这么说。”我猜是扎布扎德。你能不能也为那句话找到一个来源?是的,请问,你是从哪里引用的?“我不知道有谁这么说,”我猜是扎布扎德。我完全同意你的看法。我认为他们本可以把这条规则做得更好,因为它在技术上是错误的。我认为安迪说得很好,为什么这么说,我完全同意你的看法。我认为他们本可以把这条规则做得更好,因为它在技术上是错误的。我认为安迪说得很好,为什么这么说。