これがfinallyブロックでのreturnの興味深い比較です-Java/C#/ Python / JavaScript :(アーカイブリンク)
最後から戻る
ちょうど今日、私はJavaのバグを手伝っていましたが、興味深い問題に遭遇しました。try/ catchステートメント内でreturnを使用するとどうなりますか?最後のセクションが起動する必要がありますか?問題を次のコードスニペットに簡略化しました。
次のコードは何を出力しますか?
class ReturnFromFinally {
public static int a() {
try {
return 1;
}
catch (Exception e) {}
finally{
return 2;
}
}
public static void main(String[] args) {
System.out.println(a());
}
}
私の最初の推測は、それが印刷されるべきであるということ1
です、私は呼ん
でいますreturn
、それで私は1つが返されると思います。ただし、そうではありません。

ロジックは理解できたので、最後にセクションを実行する必要がありますが、どういうわけか不安を感じます。この場合、C#が何をするか見てみましょう。
class ReturnFromFinally
{
public static int a()
{
try {
return 1;
}
catch (System.Exception e) {}
finally
{
return 2;
}
}
public static void Main(string[] args)
{
System.Console.WriteLine(a());
}
}

私はむしろこの振る舞いを好みます。finally節で制御フローを台無しにすることはできないので、足を撃たれるのを防ぎます。完全を期すために、他の言語が何をするかを確認しましょう。
Python:
def a():
try:
return 1
finally:
return 2
print a()

JavaScript:
<script>
function ReturnFromFinally()
{
try
{
return 1;
}
catch (e)
{
}
finally
{
return 2;
}
}
</script>
<a onclick="alert(ReturnFromFinally());">Click here</a>

C ++とPHPにはfinally句がないため、コンパイラー/インタープリターを使用している最後の2つの言語を試すことはできません。
私たちの小さな実験は、C#がこの問題に対して最も優れたアプローチを持っていることをうまく示しましたが、他のすべての言語が同じ方法で問題を処理することを知って非常に驚きました。