为什么说:"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(); }

这种传播的替代方法是在方法内部处理它。关键是,你必须选择用它做什么。