Java

Java OR条件でカッコを忘れると思わぬバグが発生する

Javaで条件式を書く際に「または」(||)を使うときにカッコを忘れると思わぬバグが発生してしまうことがあります。

本記事では条件式で「または」条件を使用するときにバグが発生するパターンと、対策をご紹介します。

条件式で「または」を使用するときに不具合が発生するパターン

以下の条件を両方満たしているケースを条件式にしたいとします。

  • iの条件がtrue
  • jかkの条件がtrue
public class OrSample {
    public static void main(String[] args) {
        int i = 0;
        int j = 1;
        int k = -1;

        // ケース1
        if (i == 0 && j > 1 || k < 0) {
            System.out.println("true");
        }

        // ケース2
        if (i == 0 && (j > 1 || k < 0)) {
            System.out.println("true");
        }
    }
}

ケース1の場合、ケース2の場合のいずれもtrueと表示されます。

しかしiがfalseになる式にしてみると結果が異なってきます。

public class OrSample {
    public static void main(String[] args) {
        int i = 0;
        int j = 1;
        int k = -1;

        // ケース1
        if (i == 1 && j > 1 || k < 0) {
            System.out.println("true1");
        }

        // ケース2
        if (i == 1 && (j > 1 || k < 0)) {
            System.out.println("true2");
        }
    }
}

ケース1はtrueになってしまいました。

ケース1は実際には以下のいずれかが満たされれば、trueになるようになっているためです。

  • iの条件がtrueかつjがtrue
  • kの条件がtrue

条件式で「または」を使用するときはカッコに気をつける

以下の条件を両方とも満たしているときにtrueにするためには、「j || k」の部分をカッコでくくる必要があります。

  • iの条件がtrue
  • jかkの条件がtrue

つまり以下のようにする必要があります。

i && (j || k)

このカッコがないと、下のいずれかが満たされればtrueという全く違う条件に変わってしまいます。

  • iの条件がtrueかつjがtrue
  • kの条件がtrue

思わぬ不具合が発生する要因になるので、条件式でまたはを使用するときは適切な位置にカッコを記述するようにしましょう。

これはJavaに限らず、SQLや他の言語でも同様です。

まとめ

条件式で「または」条件を使用するときにバグが発生するパターンと、対策を紹介しました。

「または」条件を使用する際にカッコを適切に配置しないとぜんぜん違う条件になってしまい、思わぬ不具合が発生する要因となってしまいます。

条件式を書く際は注意が必要です。

 

【お知らせ 無料!】未経験エンジニアがJavaでWebサイトを作成できるようになるための学習ロードマップを、無料で公開しています!

実体験に基づいて作成されているので、プログラミングスクールなどで指導されるロードマップにも劣らない品質です。

こちらの「【Java】エンジニア未経験者がJavaを効率的に勉強する手順を紹介します」リンクから無料で閲覧できるので、是非ご覧ください!

【2021/6 更新】エンジニア未経験者がJavaを効率的に勉強する手順を紹介しますプログラミングを勉強する際に候補に出てくる言語に Java があります。 最近は Java 以外の言語である、Ruby や Pyt...