カクテルはお好きですか?
カクテルを飲むときは注意事項がひとつあります。ペース配分に気をつけましょう。
アルコール度数のわりに飲みやすいですから、慣れないと飲みすぎてしまいます。
こういうことは言葉で言うのは簡単なんですが、実際に守ろうとすると難しいものです。
さて、今回はfinallyでの変わった現象をお話しましょう。
さて、以下の4つのメソッド、それぞれ呼び出すとどのような結果になるのか分かりますか?
public static int case1() {
try {
return 1;
} finally {
return 2;
}
}
public static int case2() {
try {
return 1;
} finally {
throw new NullPointerException();
}
}
public static int case3() {
try {
throw new NullPointerException();
} finally {
return 2;
}
}
public static int case4() {
try {
throw new NullPointerException();
} finally {
throw new IllegalArgumentException();
}
}
returnしたあとに
finallyにいくはずなのですが…。
回答編
まず、case1()の場合。このメソッドは2を返します。return 1は
finallyでのreturn 2で
上書きされてしまいます。1はどこかに消えてしまうのです。
case2()以降も同じです。case2()ではNullPointerExceptionがthrowされ
return 1は消し飛びます。
case3()ではtry節でのNullPointerExceptionが
return 2で上書きされてしまい、例外が消し飛びます。
case4()ではNullPointerExceptionがIllegalArgumentExceptionで上書きされてしまいます。
つまり、どのケースでもfinally節での
returnおよびthrow
がtry節のものを上書きするのです。
finally節では基本的に
returnおよびthrow
はしてはいけません。本来の情報を失ってしまうからです。
お酒を飲むのも、finallyを使うのも、
記憶を飛ばさないように気をつけてくださいね。
投稿日時 : 2007年8月7日 13:06