04/03/13 15:07
606の問題について,自分なりに考えてみました。
JLSを少しばかり流し読みしたんですけど,それによると
「finallyブロック内で中途完了した場合は,スローされた例外は捨てられる」
とあります。中途完了とは私の思い付く限りでは,return文,またはthrow文が
finallyブロック内で実行された時です。throw文の場合は,スローした例外を
finallyブロック内でキャッチできなかった場合です。
で,プログラムの流れなんですけど,
JLSをちょこちょこっと見ただけなのでが,「スローされた例外が捨てられる」
とは,実行時だと解釈できますよね。
でも実は,methodメソッドのthrows宣言がなくてもコンパイルエラーとはなり
ませんでした。ということは,コンパイル時にfinallyが中途完了するという事
をチェックしている,という事でしょうか? 中途完了しないようにreturnを削
除してコンパイルを行った所,キャッチ,またはthrows宣言がない,とエラーが
出ます。
コンパイル時にチェックされているのなら初めから例外はスローされていない
可能性も何となく考えられなくもありませんが,詳細は分かりません。
何れにせよ,finallyが中途完了した場合は,それまでに例外がスローされて
いたなら,その例外オブジェクトは無効になってしまう,ということです。
実務は未経験ですが,現場ではこのような知識も必要とされるのでしょうか?