2017-06-04 4 views
5

私はこの質問に出くわしました。私は出力の理由を理解できません。最後に文字列が返り、ブロックします

プログラムは次のとおりです。

public static String method(){ 

    String s = new String(); 
    try 
    { 
     s = "return value from try block"; 
     return s; 
    } 
    catch (Exception e) 
    { 
     s = s + "return value from catch block"; 
     return s; 
    } 
    finally 
    { 
     s = s + "return value from finally block"; 
    } 

} 

出力は次のとおりです。tryブロック

から

戻り値さて、私はそれとreturn s声明でsの値でのデバッグtryブロックはreturn value from try block,return value from catch block,returned from finally block

それでも出力は次のとおりです。tryブロック

から

戻り値はいずれも、この動作を説明していただけますか?

+0

この1つhttps:// stackoverflowを参照してください。com/questions/65035/do-finally-always-in-java-in- – mmuzahid

+1

私はあなたがここでもっと明確になると思う[try-catch-finally-return clarification - Stack Overflow](https://stackoverflow.com/questions)/01225819/try-catch-finally-return-clarification) –

+0

答えはoracleのドキュメントにあります。 "tryブロックが終了するとfinallyブロックが常に実行されます。これにより、予期しない例外が発生してもfinallyブロックが確実に実行されます。 " 次の点を確認してください。https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – Oghli

答えて

1

まず、Javaがメソッド呼び出しを処理する方法を理解してみましょう。 スレッドごとに別々のスタックメモリがあります。メソッドを呼び出すと、Javaは内部的にレコードをスタックの先頭に挿入します。レコードには、パラメータ&オブジェクトなどの詳細が含まれています。

ここで興味深いフィールドが1つあります。 return文が見つかるたびに、フィールドが更新されます。今すぐコードを観察してください。

ブロックのtryブロックでは、戻り値フィールドはtryブロックの戻り値に設定されます。実行シーケンスごとにブロックfinallyが実行されます。 finallyブロックは、文字列リファレンスsを変更しました。以前にtryブロックによって解決されたreturn valueフィールドは変更されませんでした。最後にメソッド呼び出しが完了しました& Java内部でレコードをポップ&戻り値のフィールドを返します。したがって、tryブロックからの戻り値を返します。

finallyブロックが変更後に文字列を返すと、戻り値フィールドが再び更新され、更新された文字列が返されます。

-2

ついに

は、最終的には「常に」

lock.lock(); 
try { 
    //do stuff 
} catch (SomeException se) { 
    //handle se 
} finally { 
    lock.unlock(); //always executed, even if Exception or Error or se 
} 

のJava 7には明示的に自動的に近いリソースを使用することができ、新たな資源としてみてくださいステートメントを持つコードを実行するためのtry/catch文で使用されていますあなたのコードでfinallyを含める代わりに、メソッドの最後にそれを使用する場合または暗黙的try blockにjava.io.Closeableまたはjava.lang.AutoCloseable

関連する問題