0

さてここで私はAPIと他の関連する質問でこれを見ました:

try {

} catch (IOException e) {
    throw new SampleException("Other IOException", e);
}

これは新しい例外を呼び出します。

しかし今、私はそれ自体を呼び出すこの例を見てきました。ドキュメントを書き込もうとしていますが、再び呼び出されたようです。

try {
    statements;
}catch(TheException e) {
    //perform operations before exits;
    throw e; 
}

他のハンドラーが例外を処理する機会を得られるように、例外を再スローします

TheException例外の後にもう1つ追加することはできないと思いcatchます!では、この場合、他のハンドラーは誰ですか?私はそれをテストしましたが、catch句の後のコードでさえコンパイルされていないことに気付きました!

4

3 に答える 3

2

JAVAで例外がどのように機能するか、特にthrow/throwsキーワードとその違いを修正してみてください。

これはそれを説明する素晴らしいページです。

また、詳細については、いつでもドキュメントを参照できます。

あなたの質問を参照すると、が含まれているメソッドはおそらくコンパイルされないため、コードはおそらくコンパイルthrowされませんthrows TheException。これを機能させるためにメソッドヘッダーを追加するか、handles(catches)を処理​​する別のthrows TheExceptionヘッダーでを囲むことを試みることができます。try/catchtry/catchTheException

于 2012-11-05T07:01:39.693 に答える
2

では、この場合、他のハンドラーは誰ですか?

これは、句が存在しなかったかのようにほぼ正確です。ただし、のcatch句は使用されないcatchというわずかな追加があります。したがって、たとえば:

try {
    methodWhichCanThrowIOException();
} catch (IOException e) {
    throw e;
} catch (Exception e) {
    // This won't be hit for IOException
}

それで:

  • このコードを囲む別のtry/catchステートメントがある場合、そこにあるcatchブロック例外をキャッチする可能性があります
  • それ以外の場合、チェックされた例外であると仮定すると、メソッドは例外(またはスーパークラス)をスローできることを宣言する必要があり、例外は通常の方法でメソッドから伝播されます

詳細については、JLSのセクション11.3およびセクション14.20を参照してください。

于 2012-11-05T07:07:33.790 に答える
1

2つの方法があるとしましょう。

最初の1つ:

public void methodA() throws IOException {

    try {

        // methodWhichCanThrowIOException();

    } catch (IOException e) {

        // //perform operations before exits;
        throw e;
    }
}

二つ目:

public void methodB() {

    try {

        methodA();

    } catch (IOException e) {

        // //perform operations;
    }
}

メソッドBがメソッドAを呼び出す方法を参照してください。メソッドA内で最初に発生した例外は、メソッドA自体によるハンドラーですが、これが行われると、メソッドAは例外をスローすることを決定し、他のハンドラーが例外を処理する機会を得ます。メソッドAとしての別のハンドラー。メソッドAは、別のクラス、別のレイヤーにある可能性があることに注意してください。

メソッドAの場合、例外をスローすることは、メソッドBに何かが起こったことを通知するための優れた方法です。

于 2012-11-05T07:19:06.753 に答える