【JAVA】初心者バグをなくそう PART3 -&と|の使い方-


先日は比較についての記事を書きました。

今回は、そのつながりで。
if文で ”かつ”、 ”または”というように複数の条件を合わせて条件を評価したいときがあります。
今日はそのお話です。


■”かつ”、”または”を使う



下記のソースは、『引数 test がnull値や空文字ではないか』
ということを確認しようとしているソースなのですが、 1つ問題があります。

これも実際にあったバグのひとつなのですが、どこがおかしいかわかりますか?


例1-1)間違えた if 文
public boolean requiredCheck(String test) {
    if (test != null & !test.equals("")) {
        return true;
    }
    return false;
}


条件をつなげつとき、 "&" や "|" のように1つだけ記述すると
その後の式も実行されてしまいます。

つまり、test==null の条件判定の結果がtrueでもfalseでも、 test.equals("")の部分の式は必ず実行されるということです。

もし引数test に null の値が入ってきた場合どうなるでしょう?
そう、NullPointerExceptionが発生してしまうのです。

そのため下記のように記述するのが正解です。


例1-2)正しい if 文
public boolean requiredCheck(String test) {
    if (test != null && !test.equals("")) {
        return true;
    }
    return false;
}


普通、& や | だけで評価をすることは少ないかと思います。
(わざと何らかの例外を発生させたい場合などは除きます。)

なので、少し雑ですが、"&&", "||"を常に使うと
覚えてしまっても良いかもしれません。


■重複した比較


バグではないのですが、関連した話をもうひとつ。

さて、上記の例を踏まえ、下記のようなソースを見たとき
皆さんはどう考えますか?


例2-1)
public boolean flgCheck(AbcBean bean) {
    if (bean == null || (bean != null && !bean.getFlg())) {
        return false;
    }
    return true;
}


例1-2を参考に考えると
もし、bean が null のときはそれ以降の式は実行されないので
"bean != null"の部分は必要がありません。
つまり、こんな感じ。


例2-2)
public boolean flgCheck(AbcBean bean) {
    if (bean == null || !bean.getFlg()) {
        return false;
} return true; }


どうですか、不必要な部分がなくなった分スッキリしませんか?

& なのか、&& なのか。
たった1文字で大きく動作が変わってしまうのですね。

&と|の使い方のお話でした。

■今日のポイントひらめき

&, | ではその前後の式すべて実行した後評価される。
&&, || では条件が成立した時点で評価が終了する。




タグ:java 初心者


参考になりましたらクリックしていただけると励みになります。



posted by てる。 at 22:29 | Comment(0) | TrackBack(0) | 【JAVA】初心者バグをなくそう | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。