読者です 読者をやめる 読者になる 読者になる

NullPointerException

"string".equalsってバッドノウハウなの? - 神様なんて信じない僕らのためにより、NullPointerExceptionについて。

NullPointerExceptionは偉大*1だけど、
NullPointerExceptionでnullを検知しようとする考えがそもそも間違い、な気がする。

"string".equalsってバッドノウハウなの? - 神様なんて信じない僕らのために

nullの検知っていうのがちょっと広すぎるような気がする。とりあえず、

  • nullが許される場合のnullの検知
  • nullが許されない場合のnullの検知
  • nullが許されるか許されないか不明な場合のnullの検知

くらいが考えられるかな*1
で、nullが許される場合のnullの検知にNullPointerExceptionを使うのはたしかに考え方が間違っているけど、nullが許されない場合にnullがきた場合はまさに例外的な状況なわけで、この場合には素直にNullPointerExceptionを送出するのが正解だと思う*2


あと、nullが許される場合自体、NullObjectで回避するのがスマートだと思う。問題はNullObjectクラスが作れない場合。Stringがそれにあたるけど、多くの場合、空文字列で代替できる。ただ、空文字列が意味を持つ場合もあるわけで、その場合にはnullを使うのもやむなしかな。


nullを排除するための方法としては、コンストラクタで引数チェックを行ってイミュータブルにしてしまう方法を使っている。こうすれば、単体テストを行うことでnullが絶対こないオブジェクトであるという安心感が持てる。まぁ、全部をこの方法で構築するのは非現実的なんだけどね。

*1:3番目は厄介なのでここでは触れない

*2:この2つの状況では「検知」の意味がそもそも違う