Java / LESSON 04 / JV04

Java:条件分岐

1学習の目的

2基礎解説

演算子意味
&&かつ(AND)age >= 20 && member
||または(OR)a == 1 || a == 2
!でない(NOT)!member
==等しい(数値のみ)文字列は equals
✅ 覚えるべき重要ポイント
  1. 条件は上から順に判定され、最初に当てはまったものだけが実行される。else if を並べたとき、2つ目以降は「前の条件に当てはまらなかった場合」という前提が付く。
  2. ⚠ switch で break を忘れると、次のcaseも続けて実行される(フォールスルー)。case 1 で止まらず case 2 case 3 まで流れてしまう——気づきにくい不具合の原因
  3. Java 14以降は -> を使った switch式が使える。break が不要になり、値を返せるので安全で簡潔。新しく書くならこちらを推奨。
  4. && は左が false なら右を評価しない(短絡評価)。str != null && str.length() > 0 と書けば、nullのときエラーにならない——順序が重要
  5. 文字列の比較は equals(JV03)。if (name == "abc") は危険で、if (name.equals("abc")) と書く。

現場使用例:会員ランクによる割引、在庫状況の判定、入力値の検証、権限チェック。

// if - else if - else
int score = 75;

if (score >= 80) {
    System.out.println("優");
} else if (score >= 60) {
    System.out.println("良");     // ← ここが実行される
} else {
    System.out.println("可");
}

// 論理演算子
if (age >= 20 && isMember) { … }   // 両方満たす
if (a == 1 || a == 2)      { … }   // どちらか
if (!isMember)             { … }   // ではない

// ⚠ 短絡評価(順序が重要)
if (str != null && str.length() > 0) { … }
// str が null なら右は評価されない → 安全
// 逆順に書くと null のときエラーになる

// switch(従来型・break が必要)
switch (rank) {
    case "A":
        System.out.println("最上位");
        break;              // ← 忘れると次に流れる
    case "B":
        System.out.println("中位");
        break;
    default:
        System.out.println("その他");
}

// ⭐ switch式(Java 14以降・break不要)
String name = switch (n) {
    case 1 -> "月";
    case 2 -> "火";
    case 3 -> "水";
    default -> "不明";
};

// 三項演算子(単純な二択に)
String label = (stock == 0) ? "品切れ" : "在庫あり";

3基本ドリル(10問)

JV04-D01 点数75点を判定せよ(80以上なら「優」、60以上なら「良」、それ未満は「可」)。 コーディング★☆☆無料
期待される結果

出力 == 良

ヒント

if / else if / else を使う。上から順に判定される。

模範解答
public class Main {
    public static void main(String[] args) {
        int score = 75;

        if (score >= 80) {
            System.out.println("優");
        } else if (score >= 60) {
            System.out.println("良");
        } else {
            System.out.println("可");
        }
    }
}
解説

条件は上から順に判定される。75は80以上ではないので次へ進み、60以上に当てはまって「良」が出力される。

JV04-D02 switch で break を書き忘れるとどうなるか。
A. エラーになる B. 次のcaseも続けて実行される C. 何も起きない D. 最初のcaseだけ実行される
選択★☆☆無料
期待される結果

解答 == B

ヒント

フォールスルーと呼ばれる挙動。

模範解答
B
解説

break が無いと下のcaseへ流れ続ける。エラーにならないため気づきにくく、原因究明に時間がかかる不具合になる。

JV04-D03 年齢25歳・会員である人が「20歳以上かつ会員」かどうかを判定し、true/false を出力せよ。 コーディング★☆☆無料
期待される結果

出力 == true

ヒント

&& で2つの条件をつなぐ。

模範解答
public class Main {
    public static void main(String[] args) {
        int age = 25;
        boolean isMember = true;

        System.out.println(age >= 20 && isMember);
    }
}
解説

&& は両方が true のときだけ true。片方でも false なら全体が false になる。

JV04-D04 「かつ」を表す論理演算子を補ってコードを完成させよ。 穴埋め★☆☆無料
コード
public class Main {
    public static void main(String[] args) {
        int age = 25;
        boolean member = true;

        if (age >= 20 ____ member) {
            System.out.println("対象です");
        }
    }
}
期待される結果

出力 == 対象です

ヒント

AND を表す記号。アンパサンド2つ。

模範解答
&&
解説

&& は2つ重ねる。1つだけの & でも動くが、短絡評価が働かないため通常は使わない。

JV04-D05 str != null && str.length() > 0 の順序を逆にするとどうなるか(strがnullの場合)。
A. 同じ結果 B. エラーになる C. false になる D. true になる
選択★☆☆無料
期待される結果

解答 == B

ヒント

null に対して length() を呼ぶとどうなるか。

模範解答
B
解説

NullPointerException で落ちる&& は左が false なら右を見ないので、null チェックを必ず左に書く

JV04-D06 switch でランク "B" を判定せよ("A"なら「最上位」、"B"なら「中位」、それ以外は「その他」)。break を正しく書くこと。 コーディング★★☆広告解放
期待される結果

出力 == 中位

ヒント

case ごとに break を書く。default も忘れずに。

模範解答
public class Main {
    public static void main(String[] args) {
        String rank = "B";

        switch (rank) {
            case "A":
                System.out.println("最上位");
                break;
            case "B":
                System.out.println("中位");
                break;
            default:
                System.out.println("その他");
        }
    }
}
解説

switch は文字列にも使える(Java 7以降)。ただし比較は内部で equals が使われるので、null を渡すとエラーになる点に注意。

JV04-D07 switch式(Java 14以降)の矢印を補ってコードを完成させよ。 穴埋め★★☆広告解放
コード
public class Main {
    public static void main(String[] args) {
        int n = 3;

        String day = switch (n) {
            case 1 ____ "月";
            case 2 ____ "火";
            case 3 ____ "水";
            default ____ "不明";
        };

        System.out.println(day);
    }
}
期待される結果

出力 == 水

ヒント

矢印を表す2文字(マイナスと大なり)。

模範解答
->
解説

switch式なら break が不要。値を返せるので変数に代入でき、フォールスルーの事故も起きない。

JV04-D08 文字列を比較する if 文として正しいのはどれか。
A. if (name == "abc") B. if (name.equals("abc")) C. if (name === "abc") D. if (name.same("abc"))
選択★★☆広告解放
期待される結果

解答 == B

ヒント

JV03で学んだ文字列比較の原則。

模範解答
B
解説

文字列の比較は必ず equals。== は「同じ物体か」の判定なので、中身が同じでも false になることがある。

JV04-D09 break忘れの挙動を確認せよ。case 1 から case 3 まで break を書かずに数字を出力し、何が起きるか確認すること(値は1)。 コーディング★★☆広告解放
期待される結果

出力 == 123

ヒント

print(改行なし)で1・2・3を出力する。break を書かない。

模範解答
public class Main {
    public static void main(String[] args) {
        int x = 1;

        switch (x) {
            case 1:
                System.out.print("1");
            case 2:
                System.out.print("2");
            case 3:
                System.out.print("3");
        }

        System.out.println();
    }
}
解説

1だけのはずが123になった。break が無いと下へ流れ続けるので、意図しない処理まで実行されてしまう。

JV04-D10 在庫数0を判定し、三項演算子のネストで3段階に分けよ(0なら「品切れ」、10未満なら「残りわずか」、それ以外は「在庫あり」)。 コーディング★★☆広告解放
期待される結果

出力 == 品切れ

ヒント

条件 ? A : (条件2 ? B : C) の形で書ける。

模範解答
public class Main {
    public static void main(String[] args) {
        int stock = 0;

        String label = (stock == 0) ? "品切れ"
                     : (stock < 10) ? "残りわずか"
                     : "在庫あり";

        System.out.println(label);
    }
}
解説

三項演算子は繋げられるが、3段以上は読みにくくなる。複雑になったら if 文に書き直すほうがよい。

4実践シナリオ(5問)

JV04-S01 【会員ランク別の割引】ランク "gold" の会員に対し、割引率を判定せよ(gold:15%、silver:10%、それ以外:0%)。10000円の商品で「割引額:1500円」と出力すること。 コーディング★★☆広告解放
期待される結果

出力 == 割引額:1500円

ヒント

if / else if で分岐し、equals で文字列を比較する。

模範解答
public class Main {
    public static void main(String[] args) {
        String rank = "gold";
        int price = 10000;

        double rate;
        if (rank.equals("gold")) {
            rate = 0.15;
        } else if (rank.equals("silver")) {
            rate = 0.10;
        } else {
            rate = 0;
        }

        long discount = Math.round(price * rate);
        System.out.println("割引額:" + discount + "円");
    }
}
解説

equals で比較するのが要点。== を使うと、データベースから読んだ文字列で動かなくなる恐れがある。

JV04-S02 【switch式で曜日変換】数値3をswitch式で曜日に変換して出力せよ(1〜7を月〜日、それ以外は「不明」)。 コーディング★★☆広告解放
期待される結果

出力 == 水

ヒント

switch (n) { case 1 -> "月"; ... } の形。最後にセミコロンが必要。

模範解答
public class Main {
    public static void main(String[] args) {
        int n = 3;

        String day = switch (n) {
            case 1 -> "月";
            case 2 -> "火";
            case 3 -> "水";
            case 4 -> "木";
            case 5 -> "金";
            case 6 -> "土";
            case 7 -> "日";
            default -> "不明";
        };

        System.out.println(day);
    }
}
解説

switch式は値を返すので変数に代入できる。従来型より短く、break忘れの心配もない——新しく書くならこちら。

JV04-S03 【null安全な検証】文字列が null または空でないかを短絡評価で判定せよ。null の場合に「未入力です」と出力すること。 コーディング★★☆広告解放
期待される結果

出力 == 未入力です

ヒント

str != null && !str.isEmpty() の順で書く。順序が重要。

模範解答
public class Main {
    public static void main(String[] args) {
        String input = null;

        if (input != null && !input.isEmpty()) {
            System.out.println("入力あり:" + input);
        } else {
            System.out.println("未入力です");
        }
    }
}
解説

null チェックを左に書くのが鉄則。逆順にすると null に対して isEmpty() を呼ぶことになり、NullPointerException で落ちる。

JV04-S04 【送料の判定】購入金額4800円・会員でない場合の送料を判定せよ(会員は無料、非会員は5000円以上で無料・未満は600円)。「送料:600円」と出力すること。 コーディング★★★広告解放
期待される結果

出力 == 送料:600円

ヒント

会員かどうかを先に判定し、非会員の場合だけ金額で分岐する。

模範解答
public class Main {
    public static void main(String[] args) {
        int amount = 4800;
        boolean isMember = false;

        int shipping;
        if (isMember) {
            shipping = 0;
        } else if (amount >= 5000) {
            shipping = 0;
        } else {
            shipping = 600;
        }

        System.out.println("送料:" + shipping + "円");
    }
}
解説

条件を段階的に絞り込むのが読みやすい書き方。isMember || amount >= 5000 と1行にもできるが、条件が増えたとき分けたほうが管理しやすい。

JV04-S05 【複合条件】年齢25歳・会員・購入金額3000円の人が「特典対象」かを判定せよ(条件:20歳以上 かつ 会員 かつ 2000円以上)。「特典対象です」と出力すること。 コーディング★★★広告解放
期待される結果

出力 == 特典対象です

ヒント

&& を2つ使って3つの条件をつなぐ。

模範解答
public class Main {
    public static void main(String[] args) {
        int age = 25;
        boolean isMember = true;
        int amount = 3000;

        if (age >= 20 && isMember && amount >= 2000) {
            System.out.println("特典対象です");
        } else {
            System.out.println("対象外です");
        }
    }
}
解説

&& はいくつでもつなげられる。ただし条件が4つ5つと増えたら、意味のまとまりごとに変数に分けると読みやすくなる。

5仕上げ課題

JV04-FINAL 【注文の判定処理】条件分岐を組み合わせて、注文を処理せよ。

データ
String rank = "gold";
int price = 8500; int qty = 3;
int stock = 5;

処理
在庫チェック:数量が在庫を超えていたら「在庫不足です(残り5個)」と出力して終了
② 小計 = 単価 × 数量
割引率switch式 で決定(gold:0.15、silver:0.10、bronze:0.05、それ以外:0)
④ 割引額 = 小計 × 割引率(四捨五入
⑤ 割引後 = 小計 - 割引額
送料:割引後が5000円以上なら0、未満なら600
⑦ 合計 = 割引後 + 送料

期待される出力(5行)
小計:25,500円
会員ランク:gold(15%引き)
割引額:-3,825円
送料:0円
合計:21,675円


※ 割引率は switch式で求め、パーセント表示(15%)も同じ値から計算すること
総合★★★広告解放
期待される結果

出力5行が完全一致

ヒント

在庫チェックは if で早めに判定し、問題なければ処理を続ける。switch式は値を返すので double rate = switch (rank) {...}; と書ける。パーセント表示は (int)(rate * 100) で求める。金額は String.format("%,d", 値) で整形。

模範解答
public class Main {
    public static void main(String[] args) {
        String rank = "gold";
        int price = 8500;
        int qty = 3;
        int stock = 5;

        if (qty > stock) {
            System.out.println("在庫不足です(残り" + stock + "個)");
            return;
        }

        int subtotal = price * qty;

        double rate = switch (rank) {
            case "gold" -> 0.15;
            case "silver" -> 0.10;
            case "bronze" -> 0.05;
            default -> 0;
        };

        long discount = Math.round(subtotal * rate);
        long afterDiscount = subtotal - discount;
        int shipping = (afterDiscount >= 5000) ? 0 : 600;
        long total = afterDiscount + shipping;

        System.out.println("小計:" + String.format("%,d", subtotal) + "円");
        System.out.println("会員ランク:" + rank + "(" + (int) (rate * 100) + "%引き)");
        System.out.println("割引額:-" + String.format("%,d", discount) + "円");
        System.out.println("送料:" + shipping + "円");
        System.out.println("合計:" + String.format("%,d", total) + "円");
    }
}
解説

この課題では、3種類の分岐を使い分けている。在庫チェックは if、ランク判定は switch式、送料は三項演算子——それぞれ適した場面が違う

在庫チェックで return; を使っている点に注目してほしい。条件を満たさないなら早めに処理を打ち切る——この書き方を「早期リターン」と呼ぶ。もし else で残り全部を囲んでいたら、インデントが深くなって読みにくくなっていた。異常な場合を先に片付け、正常な処理は最後にまとめて書くのが実務の定石だ。

switch式 の利点も明確だ。値を返せるので double rate = switch (...) と1つの式で書ける。従来型の switch なら、変数を先に宣言して各caseで代入し、break を書き…と冗長になっていた。しかも break を1つ忘れれば、goldなのに silver の割引率が適用される金銭に関わる不具合になる。

Java 14以降で書くなら、switch式を選ばない理由はほぼない。

次章では繰り返しを学ぶ。1件の注文を処理できるようになったので、今度は何百件でも処理できるようにしていく。