有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果抛出异常,调用链是否也会抛出其所有子类?

我指导的一名学生使用的java书籍包含以下内容(蓝色鹈鹕java版本3.0.5b Charles Cook):

If you have a method that throws an IOException up to the next level in the calling chain, we should be aware that in addition to IOException being thrown to the next level, all its subclasses are also thrown to the next level in the chain.

这似乎显然是错误的,但它是正确的吗?这句话的一个版本出现在学生的考试中,应该是真的

此外,以下代码似乎是该声明的反例:

public class ExceptionsTester {
    public static void main(String[] args) {
        try {
            throw new IOException();
        } catch (FileNotFoundException e) {
        System.out.println("Subclasses thrown");
        } catch (IOException e) {
        System.out.println("Subclasses not thrown");
        }
    }
}

共 (3) 个答案

  1. # 1 楼答案

    这是不对的。首先,这是一个静态方法,静态方法不会传递给子类。其次,这个不会抛出异常。它只能处理它。通过抛出一个execption,我认为作者的意思是用throws关键字声明该方法

    比如说

    class A {
     void x() throws IOException {}
    }
    

    如果:

    class B extends A {
    @overries
    void x() {}
    }
    

    即使B中被重写的方法没有明确抛出它,在B中使用该方法的任何人都必须处理IOException

    A a = new B();
    a.x();
    

    编译器会抱怨的。你必须使用

    A a = new B();
    try {
    a.x();
    } catch (Exception e) {}
    

    所以底线是作者在某种程度上是正确的

  2. # 2 楼答案

    这在多个层面上都没有任何意义,而且措辞完全错误

    抛出一个IOException就是这样,抛出一个IOException

    IOException的子类不会被捕获,因为它们不会被抛出

    捕获一个异常的超类将捕获该异常(当然,在本例中是^{

    我不相信作者所说的,如果(比如)抛出一个IOException,那么所有IOException子类都会被抛出。通过阅读前面的章节,我认为他试图指出,如果某个东西声明它可以抛出IOException,那么它也意味着可以抛出IOException子类

    它的措辞很糟糕,但我很难相信作者认为IOException子类是在抛出IOException时抛出的——他正确地指出,子类必须在其不太具体的超类之前被捕获。我发现更有可能是编辑问题,或者只是陈述得不好

  3. # 3 楼答案

    这本书的意思是:“如果一个方法声明它抛出异常,那么异常的所有子类都可以被它抛出”吗?因为这在Java中是正确的,但它并没有告诉您捕获异常及其子类的行为(正如另一个答案所示)