2017-09-10 13 views
0

私のコードは以下の通りです: -例外処理フローの不一致

class Varr {  
    public static void main(String[] args) {  
     try { 
      System.out.println(10/0); 
     } 
     catch(ArithmeticException e) { 
      System.out.println("catch1"); 
      System.out.println("catch1"); 
      throw new ArithmeticException ("Exce");    
     } 
     finally { 
      System.out.println("finally"); 
     } 
    } 
} 

出力は次のようになります -

catch1 

catch1 

finally 

Exception in thread "main" java.lang.ArithmeticException: Exce 
    at one.Varr.main(Varr.java:22) 

は、私の知る限り1としてフローは最初のキャッチその後、試す必要があります最終的には最後に、出力ごとにフローが試行され、スロー例外ステートメントまでキャッチされ、キャッチの例外ステートメントがスローされますhブロック。

なぜフローの食い違いがあり、finallyのブロックは、定義により、どんなにの結果を実行する必要があるため、最終的catchブロックのスロー新しい例外声明

+0

たぶんこの記事は役立つことができます:https://stackoverflow.com/a/3779677/7459622答えを –

答えて

0

前に実行された理由を私は意味tryまたはcatch句。

あなたのケースでは、実行時には上方に伝播する必要がある例外があることがわかりますが、実行する前にfinallyブロック内にあるものが実行されます。

ブロックが終了すると、発生した可能性のある例外が伝搬されるか、そうでない場合はフローが継続します。

+0

おかげで、ちょうど明確化してください: - 実行時に場合 の新しい例外文を投げる場合catchブロックがfinallyブロックの前に実行されると、例外オブジェクトがJVMにハンドオーバーされ、プログラムは最終的にチャンスを得ることなく異常終了します。 また、finallyブロック自体に例外がある場合、catchブロックのthrow exception文を実行せずにfinallyブロックの例外がスローされます。 –

+0

あなたは何を明確にする必要がありますか? – alirabiee

+0

注文は次のようになります。try-catch(es)-finally。最後に、保留中の例外があればスローされ、それ以外の場合はスローされます。 – alirabiee

0

あなたはついにときtryブロックを終了、常に実行ブロックessentials of finally

を見てみることができます。この は、予期しない 例外が発生してもfinallyブロックが実行されるようにします。

+0

これは、最初の理由 "System.out.println(" catch1 "); System.out。println( "catch1"); "finallyブロックの前にcatchブロックの文が実行されるか? –

+0

@bharatbhushan *予期しない例外が発生してもfinallyブロックが確実に実行されます。あなたの2番目の 'System.out.println(" catch1 ");まで予期せぬ例外のようなものはありません – nullpointer

+0

答えをありがとう、ちょうど明確化してください: - In実行時にfinallyブロックの前にcatchブロックの新しい例外文を実行すると例外オブジェクトがJVMにハンドオーバし、プログラムは最終的にチャンスを得ることなく異常終了します。また、finallyブロックに例外がある場合それ自体はcatchブロックの例外例外文を実行せずにfinallyブロックの例外が投げられるでしょうか? –