JavaのNullPointerExceptionを論理演算子を用いて対処する

Javaにおける論理演算子を復習すると共に、NullPointerExceptionへの対処法についての紹介をします。

Javaにおける論理演算子は4つあります。

AND演算が「&&」と「&」の2つ
OR演算が「||」と「|」の2つ
の計4個です。

つまり、同じ論理演算において、同じ記号を2回重ねるものと、1回だけのものが存在しているわけです。これらの違いは短絡評価をするかしないかにあります。
Javaの論理演算における短絡評価とは、左辺の評価を以てその論理演算が決定する場合、右辺の評価を行わないということです。

AND演算を例に挙げると、左辺が偽(false)、右辺が真(true)の論理演算があるとします。
短絡評価をするAND演算子「&&」(&が2つ)を用いて、「( (左辺) && (右辺) )」の論理演算を行うと、左辺の時点でfalseになったので、その後、右辺の評価を行わずに「( (左辺) && (右辺) )」全体の演算結果としてfalseを返します。
短絡評価をするAND演算子「&」(&が1つ)を用いて、「( (左辺) & (右辺) )」の論理演算を行うと、左辺の時点でfalseと分かっていても、その後、右辺の評価を行い、「( (左辺) && (右辺) )」全体の演算結果は「偽、かつ、真」なのでfalseを返します。

これを用いることで、NullPointerExceptionに対処することができます。
実際のコードを用いて説明しましょう。

String str = null;
の場合で、
if( (str != null) && (str.equals("hoge") ) { doSomeMethod(); }
の条件式の場合、「&&」は短絡評価をするので右辺の条件式「(str.equals("hoge);」は評価されません。もし、左辺の評価式がない、または、AND演算子を「&」にしてしまうと、右辺の「(str.equals("hoge")」を評価することになるので、参照が存在しないstr変数に対し何かの処理を行うことになります。これが「NullPointerException」が発生する原因であり、上記の様なコードにすることで「NullPointerException」を見事に抑えることができました。

ただ、ここで注意しなくてはいけないソースがあります。
俺もやったことがあるのですが、上のような考え方のつもりで、以下のようにコーディングしてしまうとエラーが発生し、プログラムとして全く意味がありません。

if( (str != null) & (str.equals("hoge") ) { doSomeMethod(); }
または
if( (str == null) && (str.equals("hoge") ) { doSomeMethod(); }

前者は、ここで「&」と「&&」の意味を説明したので今は大丈夫だとは思いますが、問題は後者です。
後者のソースを記述したのに、null対策をしているんだって思いこんでいたことで、見事にNullPointerExceptionが発生し2時間くらい悩んでいた俺がいましたorz

人間思いこみってダメですね〜。
もし同様なことで悩んでいる人を見かけた、もしくは、同様の現象に立ち会った場合に、try {} catch を用いなくても解決できる場合があるということと、論理演算子の使い方と条件式の記述方法によってはNullPointerException対策になってない場合があるということを肝に銘じてコーディングしてください。

以上、JavaにおけるぬるぽTipsでした〜。

・参考サイト
Okapi Project - Java 基礎知識( 演算子 )

 
・追記
どうでも良いことなんですが、「ぬるぽTips」って日本語にすると「ぬるぽチップス」みたいなお菓子名に聞こえますよね。