75

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

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 ステートメントはどうなりますか?

4

8 に答える 8

79

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

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

于 2011-04-18T10:52:10.467 に答える
54

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

  1. 例外がスローされる
  2. 例外がキャッチされ、戻り値が 5 に設定されます
  3. 最後にブロックが実行され、戻り値が 10 に設定されます
  4. 関数は戻ります
于 2011-04-18T10:53:24.110 に答える
20

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

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

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

面白い補足

于 2011-04-18T11:10:11.890 に答える
3

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

于 2011-04-18T10:53:29.653 に答える
2

簡単に言えば、 tryまたはcatchブロックに return が存在するかどうかに関係なく、finally ブロックが return statement を支配していると言えます。

そのユースケースでは常に最終的に支配的です。

public static int m1() {
    try {
        return 100;
    } 
    catch(Exception e)
    {
        return 101;
    }
    finally {
        return 102;
    }
}

出力 - 102

于 2020-01-27T18:20:41.080 に答える
0

最終セクションは常に実行されます。たとえば、解放するものがある場合、またはある種のものをログアウトする場合、エラーが発生した場合はキャッチセクションに移動し、そうでない場合は最終的に実行されます。

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

何かを返すために使用しないでください。外でも使えます。

于 2014-01-15T08:02:57.513 に答える