4

Javaが次のシナリオをどのように取るのか疑問に思っていました

public static void main(String[] args) throws IndexOutOfBoundsException, CoordinateException, MissionException, SQLException, ParserConfigurationException {
    try {
        doSomething();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

上記のコードでは、メイン関数がさまざまな例外をスローすることを宣言していますが、関数内では一般的な例外をキャッチしています。Javaがこれを内部的にどのように受け止めているのだろうか?つまり、IndexOutOfBounds 例外をスローすると、最後のブロックdoSomething()で e.printStackTrace() が呼び出されるでしょうか?catch (Exception e) {...}

関数の throws 領域で宣言されていない例外がスローされた場合、try/catch がそれを処理することはわかっていますが、宣言で言及されている例外についてはどうでしょうか?

4

5 に答える 5

5

あなたの場合、例外がスローまたは生成されdoSomething()た場合、キャッチしているため、try-catch ブロックでキャッチされException eます。

Exceptionすべての例外の親です。すべての例外は、このクラスから継承されます。

于 2013-06-26T21:56:36.323 に答える
3

catch ブロックは、メソッド レベルの throw 宣言よりも優先されます。何かがその catch ブロックを通過する場合、それはメソッドによってスローされます (ただし、言及されたすべての例外は実際に から継承されているため、そうではありませんException)。

例外を catch ブロックで処理する必要があるが、さらに転送する必要がある場合は、再スローする必要があります。

throw e;
于 2013-06-26T21:59:48.440 に答える
1

doSomething() が IndexOutOfBounds 例外をスローすると、e.printStackTrace() は最後の catch (Exception e) {...} ブロックで呼び出されますか?

はい、e.printStackTrace()呼ばれます。Exception(直接または間接のスーパークラスのいずれか)IndexOutOfBoundExceptionまたはthrows句に入れた他の例外よりも広いものをキャッチしたためです。IndexOutOfBoundExceptionただし、throws 句で他の例外よりも狭いいくつかの例外をキャッチし、これらの例外のいずれかが発生すると、throws 句がトリガーされます。

于 2013-06-26T21:59:34.723 に答える
0

次のコードがあるとします。

   try{
        doSomething();
    }catch(Exception ex){
        System.out.println("Exception:");
        ex.printStackTrace();
    }catch(IndexOutOfBoundsException ex){
         System.out.println("IndexOutOfBoundsException :");
        ex.printStackTrace();
    }

というコンパイルエラーが表示されます

例外 IndexOutIfBoundsは既にキャッチされています

これは、すべての例外がクラスから継承されるExceptionため、catch ブロックが最初にキャッチするのは例外であるためです。これは、 IndexOutOfBoundsが例外であるため、1 回目と 2 回目の 2 回キャッチする必要がないためです。あるケースでは、try-catch の
後または中で例外クラスを宣言しないと、スローが機能します。throws

于 2013-06-26T22:07:08.103 に答える