7
class Y {
    public static void main(String[] args) throws RuntimeException{//Line 1
        try {
            doSomething();
        }
        catch (RuntimeException e) {
            System.out.println(e);
        }
    }
    static void doSomething() throws RuntimeException{ //Line 2
        if (Math.random() > 0.5) throw new RuntimeException(); //Line 3
        throw new IOException();//Line 4
    }
}

2 種類の例外 (Line4 の IOException と Line3 の RunTimeException) をスローすると、1 行目と 2 行目の throws 句で「IOException」を指定するまでプログラムがコンパイルされないことがわかりました。

一方、「スロー」を逆にして IOException がスローされたことを示すと、以下に示すように、プログラムは正常にコンパイルされます。

class Y {
    public static void main(String[] args) throws IOException {//Line1
        try {
            doSomething();
        }
        catch (RuntimeException e) {
            System.out.println(e);
        }
    }
    static void doSomething() throws IOException {//Line 2
        if (Math.random() > 0.5) throw new RuntimeException();//Line 3
        throw new IOException();//Line 4
    }
}

RuntimeException もスローされる (3 行目) にもかかわらず、常に IOException に「スロー」を使用する必要があるのはなぜですか?

4

2 に答える 2

19

これは Checked Exception であるためIOException、処理するか、スローするように宣言する必要があります。反対に、RuntimeException未チェックの例外です。メソッド throws 句でスローされるように処理または宣言する必要はありません (つまり、チェックされていない例外を処理しなければ、構文的に正しいでしょう。コンパイラは怒らないでしょう)。ただし、状況によっては、Unchecked Exception に応じて処理し、対応する必要があります。


関連記事:

参考文献:

于 2013-08-24T08:22:50.853 に答える
1

その理由は、この場合、2 つの異なるタイプの例外があるためです。1 つはcheckedプログラマが処理する必要があるunchecked例外で、もう 1 つは特別な処理を必要としない例外です。

于 2013-08-24T08:23:28.397 に答える