- 作者: ジョシュア・ブロック,ニール・ガフター,柴田芳樹
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2005/11/14
- メディア: 大型本
- 購入: 3人 クリック: 81回
- この商品を含むブログ (56件) を見る
この本を入手しました。今更ですが...。
Effective Java 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/11/27
- メディア: 単行本(ソフトカバー)
- 購入: 66人 クリック: 831回
- この商品を含むブログ (256件) を見る
Effective Javaで登場する多くの教訓がパズル形式で登場します。面白いですよ〜。
というわけで、この本からの問題。
このプログラムは何を表示するでしょうか?コンパイルできるかなども含めて考えてみてください。
public class Indecisive { public static void main(String[] args) { System.out.println(decision()); } private static boolean decision() { try{ return true; } finally { return false; } } }
答えは、falseです。理由を理解するのは突然完了という動作を理解する必要があります。
try-finally文では、制御がtryブロックから抜けた時に、finallyブロックは常に実行される。ブロックが正常に処理される場合と、今回のようにreturnで突然に完了する(以下、突然完了という*1場合でも、finallyブロックは実行されます。
今回の場合だと、tryブロックとfinallyブロックの両方が突然完了している。この場合はtryブロックでの突然完了は破棄されてfinallyブロックで突然完了する。つまり、tryブロックでtrueを返そうとするが、キャンセルされてfinallyでfalseが返るということです。tryの突然完了の理由がかき消されてしまうわけです。
これを避けるには、finallyでreturnやbreak、continue, throwで抜けないようにしろ、とのこと。そして、finallyブロックでチェックされる例外もスローしちゃいけないそうだ。
自分ではfinallyではreturnするようなコードを書いたことがないが、常に意識したいことです。
追記:
decisionメソッドにstaticをつけ忘れた orz
*1:例外スローやbreakやcontinueが実行される場合でも突然完了する