次のコードを参照して、出力動作を説明してください。
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ステートメントはどうなりますか?
finally
が他のすべての後に実行されるため、finally
の1つによってオーバーライドされます。
それが、経験則-finally
から決して戻らないの理由です。たとえば、Eclipseはそのスニペットに関する警告を表示します:「最終ブロックは正常に完了しません」
finally
は常に実行されます(唯一の例外はSystem.exit()
です)。この動作は次のように考えることができます。
VMの低レベルレイアウトを覚えている場合、これは簡単な質問です。
このようなことについて確信が持てない場合は、基礎となるシステムの理解に戻ります(最終的にはアセンブラーレベルになります)。
( 面白いサイドノート )
finally
ブロックは常に実行され(一致するtryが実行された場合)、メソッドがcatch
ブロックのように5を返す前に、finally
ブロックを実行して10を返します。
finallyセクションは常に実行されます。例えばリリースするものがある場合、またはある種のものをログアウトする場合、エラーが発生した場合はcatchセクションに進み、そうでない場合は最終的に実行されます。
Session session // opened some session
try
{
// some error
}
catch { log.error }
finally
{ session.logout();}
何も返さないようにしてください。外でも使用できます。