web-dev-qa-db-ja.com

catchおよびfinallyでのreturnステートメントの動作

次のコードを参照して、出力動作を説明してください。

public class MyFinalTest {

    public int doMethod(){
        try{
            throw new Exception();
        }
        catch(Exception ex){
            return 5;
        }
        finally{
            return 10;
        }
    }

    public static void main(String[] args) {

        MyFinalTest testEx = new MyFinalTest();
        int rVal = testEx.doMethod();
        System.out.println("The return Val : "+rVal);
    }

}

結果は戻り値Val:10です。

Eclipseは警告を表示します:finally block does not complete normally

Catchブロックのreturnステートメントはどうなりますか?

67
Ammu

finallyが他のすべての後に実行されるため、finallyの1つによってオーバーライドされます。

それが、経験則-finallyから決して戻らないの理由です。たとえば、Eclipseはそのスニペットに関する警告を表示します:「最終ブロックは正常に完了しません」

73
Bozho

finallyは常に実行されます(唯一の例外はSystem.exit()です)。この動作は次のように考えることができます。

  1. 例外がスローされます
  2. 例外がキャッチされ、戻り値が5に設定されます
  3. 最後にブロックが実行され、戻り値が10に設定されます
  4. 関数は戻ります
50
Vladimir Ivanov

VMの低レベルレイアウトを覚えている場合、これは簡単な質問です。

  1. 戻り値は、キャッチコードによってスタックに格納されます。
  2. その後、finallyコードが実行され、スタックの値が上書きされます。
  3. 次に、メソッドは呼び出し元が使用する最新の値(10)で戻ります。

このようなことについて確信が持てない場合は、基礎となるシステムの理解に戻ります(最終的にはアセンブラーレベルになります)。

面白いサイドノート

18
mafu

enter image description here

System.exit()ステートメントがfinallyブロックの最初にない限り、finallyブロックは常に実行されます。

したがって、上記の例では、tryステートメントによってExectionがスローされ、catchブロックでcatchを取得します。値5を持つreturnステートメントがあるため、スタック呼び出し値5が最終的に実行されたブロックに追加され、最新の戻り値が追加されますスタックの最上位で値を返している間、スタックはスタックの動作に従って最新の値を返します "LAST IN FIRST OUT"。したがって、値は10として返されます。

3
Avinash Pande

finallyブロックは常に実行され(一致するtryが実行された場合)、メソッドがcatchブロックのように5を返す前に、finallyブロックを実行して10を返します。

3
MByD

finallyセクションは常に実行されます。例えばリリースするものがある場合、またはある種のものをログアウトする場合、エラーが発生した場合はcatchセクションに進み、そうでない場合は最終的に実行されます。

Session session //  opened some session 
try 
{
 // some error 
}
catch { log.error }
finally 
{ session.logout();}

何も返さないようにしてください。外でも使用できます。

0
Vikaaa..