如果抛出异常,调用链也会抛出它的所有子类?

时间:2013-02-06 03:33:16

标签: java exception exception-handling

我教导的一名学生使用的Java书包含以下内容(Blue Pelican Java版本3.0.5b Charles Cook):

  

如果你有一个方法将IOException抛出到调用链的下一个级别,我们应该知道除了IOException被抛到下一级别之外,它的所有子类也被抛到下一级别。链

这显然是错误的,但这是正确的吗?这个陈述的一个版本是针对学生的考试提出的,应该是真的。

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

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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

它在多个级别上没有任何意义,因为措辞是完全错误的。

投掷IOException就是这样做,抛出IOException

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

捕获异常超类捕获异常(当然,在这种情况下,它是java.lang.Exception

我不相信作者声明如果抛出IOException,那么也抛出所有IOException子类。基于阅读前面的部分我认为他试图指出如果某些事情声明它可以抛出IOException它意味着可以抛出IOException子类。

它的措辞非常糟糕,但是我很难相信作者认为抛出IOException时会抛出IOException子类 - 他正确地指出必须在紧接之前的特定于较少的超类之前捕获子类。我发现它更有可能出现编辑问题,或者说它的陈述很差。

答案 2 :(得分:1)

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

例如

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

如果:

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

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

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

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

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

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