疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【Java】if文での条件の判定順

今回はif文での条件判定の順番について書いていきます。

判定順番?そんなの書いた通りの順番じゃん。
と思う方も多いかもしれません。その通りです。
ですがこれ、実は私は何気にハマりました。
具体的にはnullチェックを行う上でのことです。


まず初めに、前振りではないんですけどちょっと余談。
通常equalsメソッドを使う場合は

定数.equals(変数)

というような書き方が一般的だと思います。
理由としては、上記の書き方であれば変数がnullでも例外は発生しません。
仕組みまではわかりませんが実行出来ますし比較も行えます。
ですが今回は例外が起きる前提でnullチェックを行うため変数と定数の位置を逆にします。


ソース

String str = "";

if (str.equals("")) {
	System.out.println("strは空文字です。");
}

strが空文字だったら「strは空文字です。」が表示されます。
一部の状況を除いて問題なく動作するはずです。

その一部とは、strがnullだった場合です。
nullは空文字とは違い、値が何も入っていない状態です。
それを参照しようとするとNullPointerExceptionが発生します。

この例外を発生させないためにはnullチェックを行う方法があります。

if (str != null) {
}

こんな感じ。
strがnullでなければ〜という条件です。

ここで私は詰まりました。
最初に書いた、空文字だった場合の条件にnullチェックも追加したい。
なんだ簡単じゃん、合わせればいいだけじゃん。

if( str.equals("") && str != null)) {
}

はい完成。

実際にstrにnullを代入して実行してみるとNullPointerExceptionが出ます。
え?nullチェックしてるよ?なんで?

そうです。if文の括弧内での順番です。
括弧の中は左から順番に条件判定されます。というかJavaの仕様として左から順番に処理していきます。
ということは、上記の条件ではnullチェックが入っていてもその前にstrの値が参照されてしまっているのです。

if文を2つに分ける方法もありますが今回は1つのif文で行うものとします。
つまりこれが正解。

ソース

String str = "";

if (str != null && str.equals("")) {
	System.out.println("strは空文字です。");
}

正直解決したときは軽くつぶやいちゃいました。
しょうもな。
でも詰まるっていうのはそう言うことだと思います。
蓋を開けてみれば微妙な違いだったり、それこそスペルミスだったりもします。

コードは上から下に、左から右に流れていきます。
その点を理解すれば今回のような順番も簡単です。

今回は以上になります。