2013-06-04 5 views
5

私は3つのステートメントを含むtryブロックがあり、すべてが例外を引き起こします。 3つの例外すべてを関連するキャッチブロックで処理する必要があります。可能ですか?1つのtryブロックに対応する複数のcatchブロックを実行できますか?

このような何か - >

class multicatch 
{ 
    public static void main(String[] args) 
    { 
     int[] c={1}; 
     String s="this is a false integer"; 
     try 
     { 
      int x=5/args.length; 
      c[10]=12; 
      int y=Integer.parseInt(s); 
     } 
     catch(ArithmeticException ae) 
     { 
      System.out.println("Cannot divide a number by zero."); 
     } 
     catch(ArrayIndexOutOfBoundsException abe) 
     { 
      System.out.println("This array index is not accessible."); 
     } 
     catch(NumberFormatException nfe) 
     { 
      System.out.println("Cannot parse a non-integer string."); 
     } 
    } 
} 

は、次のような出力を得ることが可能ですか? - >>

Cannot divide a number by zero. 
This array index is not accessible. 
Cannot parse a non-integer string. 
+0

このようなログメッセージは何の助けになると思いますか? –

答えて

10

は、次のような出力を得ることは可能ですか?

いいえ.1つの例外だけがスローされるためです。実行すると、例外がスローされるとすぐにブロックtryが残され、ブロックcatchと一致すると仮定すると、そこにも続きます。それはtryブロックに戻っていないので、2番目の例外で終わることはできません。

詳細については、section 11.3 of the JLSを参照してください。

+0

Oh fine .. thnks –

2

複数の例外をキャッチする場合は、コードを複数のtry/catchブロックに分割する必要があります。

より優れた方法は、データとログのエラーを検証し、例外をトリガーすることなくこれを行うことです。

0

単一のtryブロックから複数の例外をキャッチしませんが、Jonの答えに追加するには、複数のハンドラに1つの例外を処理させることができます。

try 
{ 
    try 
    { 
     throw new Exception("This is an exception."); 
    } 
    catch(Exception foo) 
    { 
     System.Console.WriteLine(foo.Message); 
     throw; // rethrows foo for the next handler. 
    } 
} 
catch(Exception bar) 
{ 
    System.Console.WriteLine("And again: " + bar.Message); 
} 

これは出力を生成します。

This is an exception. 
And again: This is an exception. 
0

これは本当に悪い習慣ですが、あなたは(finallyブロックを使用して、あなたの問題を解決するため)次のことが可能です。

private static void Main() 
     { 
      int[] c={1}; 
      String s="this is a false integer"; 
      try 
      { 
       int z = 0; 
       int x = 5/z; 
      } 
      catch (ArithmeticException exception) 
      { 
       Console.WriteLine(exception.GetType().ToString()); 
      } 
      finally 
      { 
       try 
       { 
        c[10] = 12; 
       } 
       catch(IndexOutOfRangeException exception) 
       { 
        Console.WriteLine(exception.GetType().ToString()); 
       } 
       finally 
       { 
        try 
        { 
         int y = int.Parse(s); 
        } 
        catch (FormatException exception) 
        { 
         Console.WriteLine(exception.GetType().ToString()); 
        } 
       } 

       Console.ReadKey(); 
      } 
     } 
のすべてを表示
0

一度に処理する例外は不可能です。各例外catchの目的は、Exceptionタイプごとに異なる処理を行うことです。それ以外の場合は、すべて一緒に印刷するのは無意味です。

0

いいえ、

それはすべての3つのcatchステートメントを実行しません。 TRYブロックはエラーをチェックし、TRYブロックから実行が終了します。次に catchが実行されます。あなたのケースでは、ArithmeticExceptionが例外階層の先頭にあります。実行され、プログラムが終了します。

あなたは、キャッチ(例外e)前にはArithmeticExceptionを与える場合は、例外のキャッチが実行されます...SystemException階層についてのより良い情報をMSDN