[Java][Tips] ショートサーキット論理演算子

体系的にJavaを学習していないと、意外に知らなかったりするのが「ショートサーキット論理演算子」です。ショートカット演算子などとも呼ばれます。

論理演算子で「AND」の演算をする演算子には「&」「&&」が、「OR」の演算をする演算子には「|」「||」があります。それぞれ、後者の演算子がいわゆる「ショートサーキット論理演算子」です。

ショートサーキット論理演算子の特徴は、「左辺の結果だけで全体の演算結果が分かるときは、右辺の演算を省略する」という点にあります。

例えば、

int a = 1;
int b = 3;

の場合に、

(a>b)&&(b>1)

という演算をする場合、 (a>b)すなわち(1>3)はfalseになります。AND演算は左辺・右辺ともにtrueのときのみ全体がtrueになりますので、左辺の演算結果がfalseと判明した時点で、右辺を演算せずとも全体がfalseになることは自明です。このとき、ショートサーキット論理演算子を使っている場合には右辺の演算は省略され、全体の演算結果がfalseになります。

これが、OR演算の場合は

(a<b)||(a>2)

という演算をする場合、(a<b)すなわち(1<3)はtrueになります。OR演算は左辺か右辺のどちらか一方でもtrueであれば全体がtrueになるため、この例では全体がtrueになることは自明です。この場合も右辺の演算は省略され、全体の演算結果がtrueとなります。

これがどういうときに便利なのか、という話なんですが、例えば、「ある文字列がnullでなく、かつ長さが10以上」といった条件式を書きたい場合などがこれにあたります。次のような条件文でstrがString型の変数として、

if ((str != null)&(str.length()>=10)) { ・・・

という条件式を書いてしまうと、strがnullのときに、「&」の左辺と右辺を必ず評価(演算)してしまうために、右辺の演算でNullPointerExceptionが発生してしまいます。

if ((str != null)&&(str.length()>=10)) { ・・・

であれば、strがnullのときには、左辺の評価結果がfalseになるために右辺の評価は省略されますので、NullPointerExceptionの発生を回避し、正常に条件式の実行を続けることができます。