Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么会这样说:“为什么?”;选中的异常不会在调用链中转发(已传播)“;?_Java_Exception_Chaining_Propagation_Checked Exceptions - Fatal编程技术网

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(); }

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

你能不能也为该声明链接一个来源?是的,请问,你从哪里引用?“我不知道有谁会这么说。”我猜是扎布扎德。你能不能也为那句话找到一个来源?是的,请问,你是从哪里引用的?“我不知道有谁这么说,”我猜是扎布扎德。我完全同意你的看法。我认为他们本可以把这条规则做得更好,因为它在技术上是错误的。我认为安迪说得很好,为什么这么说,我完全同意你的看法。我认为他们本可以把这条规则做得更好,因为它在技术上是错误的。我认为安迪说得很好,为什么这么说。