12
public void testFinally(){
System.out.println(setOne().toString());

}

protected StringBuilder setOne(){
StringBuilder builder=new StringBuilder();
try{
builder.append("Cool");
return builder.append("Return");
}finally{
builder=null; /* ;) */
}
}

なぜ出力はnullではなくCoolReturnなのですか?

よろしく、
マヘンドラアスネリア

4

3 に答える 3

14

式はreturnステートメントの値に評価され、それが返される値です。finallyブロックは、returnステートメントの式評価部分の後に実行されます。

もちろん、finallyブロックは、戻り値によって参照されるオブジェクトの内容を変更できます。たとえば、次のようになります。

finally {
  builder.append(" I get the last laugh!");
}

その場合、コンソールの出力は「CoolReturn I get the last laugh!」になります。-ただし、実際に返される値は変更できません。

于 2011-01-07T12:57:24.030 に答える
2

どうやらそれはnullであるはずですが、Javaでの参照による受け渡しの概念では、次のようになります。

1> return builder.append("Return")...行が実行され、ビルダー参照 のコピーが参照渡しによってtestFinally()メソッドに返されます

2> finalブロックで実行している間ビルダーbuilder=null参照逆参照されますが、以前にビルダー参照によって参照されたヒープ内の実際のオブジェクトは、ヒープ内にまだ存在し、ビルダー参照の返されたコピー(これはを指す参照でもあります)同じオブジェクト)がまだ存在し、値 "CoolReturn"を保持しているため、戻り値が出力されます。

于 2013-04-22T13:06:49.693 に答える
0

finallyブロックは、tryブロックの実行、 「クリーンアップ」に使用されます。すでに参照を返しているので、この方法で参照を変更することはできません。

于 2011-01-07T12:57:43.580 に答える