4
class chain_exceptions{
   public static void main(String args[]){
      try
      {
         f1();
      }
      catch(IndexOutOfBoundsException e)
      {
         System.out.println("A");
         throw new NullPointerException(); //Line 0
      }
      catch(NullPointerException e) //Line 1
      {
         System.out.println("B");
         return;
      }
      catch (Exception e)
      {
         System.out.println("C");
      }
      finally
      {
         System.out.println("D");
      }
      System.out.println("E");
   }

   static void f1(){
      System.out.println("Start...");
      throw new IndexOutOfBoundsException( "parameter" );
   }
}

行 1 が行 0 からスローされた NullPointerException をキャッチすることを期待していましたが、発生しません。

しかし、なぜそうですか?

別の catch ブロックが定義されている場合、Line1 の NPE ハンドラーがそれをキャッチできないのはなぜですか?

「スロー」が直接 main() メソッドに行くからですか?

4

11 に答える 11

9

Catch{ . . . }ブロックはブロックに関連付けられtry{ . . . }ます。ブロックは、try ブロックからスローされたcatch例外のみをキャッチできます。最初の catch ブロックの後の他の catch ブロックは try ブロックに関連付けられていないため、例外をスローしてもキャッチされません。またはmain()、例外をキャッチしません。

各 catch ブロックのこのようなものは、あなたがしようとしていることを行います。

try{
  try
  {
     f1();
  }
  catch(IndexOutOfBoundsException e)
  {
     System.out.println("A");
     throw new NullPointerException(); //Line 0
  }
}
catch(NullPointerException e) //Line 1
{
     System.out.println("B");
     return;
}
于 2013-09-04T07:51:25.670 に答える
3

catch ブロックは、try ブロック専用です。他の catch ブロックからの例外はキャッチされません。

于 2013-09-04T07:51:18.377 に答える
3

catchtry { ... }ステートメントは、ブロックからスローされた例外のみをキャッチします。

は、ブロックではなく、ブロックNullPointerExceptionからスローされます。catch { ... }try { ... }

ブロックからスローされた例外をキャッチするには、その中に別のcatchブロックを配置する必要があります。外側では、オリジナルをラッピングすることもできます。 trytry...catch

于 2013-09-04T07:51:21.733 に答える
1

catchは、によってスローされた例外のみをキャッチしますf1()catch同じ try-catch-finally コンストラクトの他の句でスローされた例外は呼び出されません。

于 2013-09-04T07:51:26.013 に答える
1

f1()投げるのでIndexOutOfBoundsException

try
      {
         f1(); //throws IndexOutOfBoundsException
      }
      catch(IndexOutOfBoundsException e) //gets caught here immediately and does not check other catch blocks
      {
         System.out.println("A");
         throw new NullPointerException(); //Line 0
      }
于 2013-09-04T07:51:26.263 に答える
1

簡単な答え: はい、throwメイン メソッドに直接例外をスローします。

通常、catchブロックが実行されると、 のように動作しelse ifます。つまり、他の選択肢は考慮されません。

于 2013-09-04T07:51:28.300 に答える