java仕事で外注のPGさんが悩んでいたバグが中々興味深いものだったので紹介。因みに仕事ではjavaやCOBOLを「読む」ことが多いです。以下のようなコードを実行するとNullPointerExceptionが出ておりました。超絶うろ覚えですのでところどころ分かりにくいのはご勘弁を。hogeObjを作成。db接続処理系のクラス。}こんなカンジのコードを実行して、1のif文でelseにとんだらreturnで呼び出し元に戻る・・なんて処理を想定していたようです。hogeに1以外の値を入れて実行してみたらNullPointerExceptionに・・なんで?javaのエラーコードを見るとどうやら3でNullPointerExceptionが起きている模様。returnで抜ける時に何が起きたのか?処理順で言うと以下の流れで実行されていた。if文でhogeが1以外だったのでelseに飛んで呼び出し元にreturnしようとしたif文がtry-catchブロックの中に書かれた処理で、そのtry-catchブロックのお尻にfinallyがくっついてたのでtry-catchブロックを抜ける前にfinallyブロックの処理が実行されたしかしfinallyの3は最初にnullで初期化されたままの状態。本来は2でなんかする処理が必要だった。して検知され例外発生。returnする場合のhogeObjの状態をきちんと考えずにreturnで抜けようとしてたのが原因。finallyにそんな状態が分かりにくいオブジェクトのメソッド書くなとも言えるけど、ここで呼んでるのは確かdb.closeみたいな処理だったので普通はfinallyに書くものか・・やっぱオブジェクトの状態遷移というか、ちゃんとメソッドを呼べるようになっているかどうかを考えながら書いてないのが原因かなぁ。対処法として、tryの位置を1のif文の直後に変更してif文はtry-catchブロックの中に含まれないようにすることで、returnするときにfinallyに飛ばないようにしました。hogeObjのインスタンス化をtryの直後にやってあげてもいいんだけど、まぁif文の処理を見るに例外が出そうな処理じゃなかったのでtry-catchから外すだけでいいんじゃね?と。しても、ワシもreturnは問答無用で呼び出し元に戻る命令だと思ってたのでやらかす可能性はあった訳です。追記:ちょっと違う話ですが、finally句でreturnしようとするとそこに行き着くまでのtry文で発生した例外がthrowされなくなってしまうそうです。これも気をつけないといけないですね。(1)検索リンクGitHubseri::diary::graduate_schoolseri::diary::competitive_programmingはてなブログをはじめよう!serihiroさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。