0

私が指導している学生の 1 人が使用している Java の本には、次の内容が含まれています (Blue Pelican Java version 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

複数のレベルで意味がなく、言葉遣いは完全に誤りです。

をスローIOExceptionすると、まさにそれが行われ、 がスローされ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 に答える