これは、内部のコードが完了しfinallyた後に try..catch..finally のブロックが実行されるために発生します。try..catch
finallyで返された以前の値が割り当てられますtry
finally のコードは常に実行されますが、既に の値が返されていますtry。
try {
++a;
return a;
} finally {
a = 10;
}
現在のa値は10、 の後returnです。良い習慣ではありませんが、デモ用です。
int a= 0;
try {
++a;
return a;
} finally {
a = 10;
return a;
}
今returnです10。
編集:
あなたの疑問:なぜエラーが発生しないのですか?
try-catch-finallyブロック内は異なります。同じブロックで同じことをして見てください。
try {
++a;
return a;
a=100; //compiler error.
} finally {
a = 10;
}
編集2
try-catch-finally の Java 言語仕様から:
try ステートメントはブロックを実行します。値がスローされ、try ステートメントにそれをキャッチできる 1 つ以上の catch 句がある場合、制御は最初のそのような catch 句に移されます。try ステートメントに finally 句がある場合、try ブロックが正常に完了したか突然完了したかに関係なく、また最初に catch 句に制御が与えられたかどうかに関係なく、別のコード ブロックが実行されます。