0

我辅导的一位学生使用的 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");
        }
    }
}
4

3 回答 3

4

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

于 2013-02-06T03:44:47.537 回答
2

它在多个层面上没有任何意义,而且措辞完全是错误的。

抛出 anIOException正是这样做的,抛出一个IOException.

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

捕获异常的超捕获异常(尽管在这种情况下它java.lang.Exception当然是 )。

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

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

于 2013-02-06T03:41:53.047 回答
1

好吧,这是不正确的。首先,这是一个静态方法,静态方法不会传递给子类。其次,这个不会引发异常。它只处理它。通过抛出异常,我认为本书作者的意思是用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) {}

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

于 2013-02-06T03:45:35.430 回答