Java | 基礎文法:else if

Java Java
スポンサーリンク

else if の全体像

else if は「複数の条件を上から順に評価して、最初に一致した処理だけを実行する」ための構文です。ifelse の間に挟み、分岐を段階的に重ねられます。評価は上から下へ直列で行われ、どれかが true になった時点で残りは評価されません。設計のコツは「条件の優先度を上位から下位へ並べる」「しきい値が重ならないようにする」ことです。


基本形と書き方のルール

最小の書式

int score = 75;

if (score >= 80) {
    System.out.println("A");
} else if (score >= 70) {
    System.out.println("B");
} else if (score >= 60) {
    System.out.println("C");
} else {
    System.out.println("D");
}
Java

「上位から下位へ」並べることで、重複なく明確に範囲が分かれます。どのブロックにも 1 行でも必ず {} を付けると、将来の変更で意図しない誤動作を防げます。


評価順序と優先度設計(重要ポイントの深掘り)

上から順に、最初の一致のみ

else if は上から順に評価され、最初に true になったブロックだけが実行されます。後段の条件がどれほど厳密でも、前段で吸収される並び方をすると到達しません。優先度の高い条件(特例やエラー)は上側に置きます。

int age = 65;
if (age < 6) {
    System.out.println("未就学");
} else if (age >= 65) {
    System.out.println("シニア"); // ここで決まる
} else if (age <= 18) {
    System.out.println("学生");   // 65 ではここまで来ない
} else {
    System.out.println("一般");
}
Java

しきい値の重複を避ける

条件に重複があると、意図と違うブロックに入ります。範囲は「閉じる/開く」を統一して設計し、境界値(例:60、70、80)で必ず動作確認しましょう。


条件式の作り方とガード(重要ポイントの深掘り)

比較と論理の組み合わせ

複数条件を組むときは、短絡評価(&&/||)を活かして「左に前提(null チェック・範囲チェック)、右に詳細」を置きます。これで安全な評価順序が作れます。

String name = "Java";
if (name != null && name.length() >= 5) {
    System.out.println("長めの名前");
} else if (name != null && name.startsWith("J")) {
    System.out.println("Jで始まる");
} else {
    System.out.println("その他");
}
Java

デ・モルガンの法則で否定を整理

大きな否定 !(...) は読みにくくなります。else if で言い換え、肯定形に近づけると理解が速くなります。

int x = 15;
if (x < 10) {
    System.out.println("10未満");
} else if (x > 20) {
    System.out.println("20より大きい");
} else {
    System.out.println("10〜20の範囲");
}
Java

よくある落とし穴と対策

ダングリング else の誤結合を避ける

else/else if が「直前の if に結びつく」ことをインデントではなく構文で明示するため、必ずブロック {} を使います。中括弧なしの 1 行 if/else は誤読と事故の温床です。

特例の順番ミス

「先に広い条件」を書くと特例に到達しません。特例・エラーケース・禁止条件は先頭に置き、デフォルトは最後の else にします。

if (user == null) {
    System.out.println("ユーザー必須");
} else if (!user.isActive()) {
    System.out.println("無効ユーザー");
} else {
    System.out.println("処理続行");
}
Java

副作用を条件に混ぜない

else if ((x = calc()) > 0) のように代入や更新を条件に混ぜると、意図が読みにくくバグを招きます。更新と判定は分離して書きます。


実用例で身につける

例 1: 料金テーブル(重複のない範囲設計)

public class Pricing {
    public static void main(String[] args) {
        int age = 40;
        int price;

        if (age < 6) {
            price = 0;
        } else if (age <= 18) {
            price = 500;
        } else if (age >= 65) {
            price = 700;
        } else {
            price = 1000;
        }
        System.out.println(price);
    }
}
Java

「上から順に」かつ「範囲が重ならない」ので、境界バグを避けられます。

例 2: 入力検証(失敗を先に弾く)

public class Validator {
    public static void main(String[] args) {
        String email = "user@example.com";

        if (email == null || email.isBlank()) {
            System.out.println("メールは必須です");
        } else if (!email.contains("@")) {
            System.out.println("@ を含めてください");
        } else if (email.length() > 256) {
            System.out.println("長すぎます");
        } else {
            System.out.println("検証 OK");
        }
    }
}
Java

一般的な失敗から順に弾き、最後の else を「成功の受け皿」にすると読みやすい流れになります。

例 3: 日付カテゴリ(優先度を上から)

import java.time.*;

public class DateCategory {
    public static void main(String[] args) {
        DayOfWeek d = LocalDate.now().getDayOfWeek();
        if (d == DayOfWeek.SATURDAY || d == DayOfWeek.SUNDAY) {
            System.out.println("休日");
        } else if (d == DayOfWeek.FRIDAY) {
            System.out.println("金曜");
        } else {
            System.out.println("平日");
        }
    }
}
Java

特例(休日)→準特例(金曜)→デフォルト(平日)の順で優先度を明確化しています。


設計の指針(重要ポイントのまとめ)

else if は「一列で決める」分岐です。優先度の高い条件を上に、デフォルトを最後の else に。範囲としきい値は重複がないよう設計し、境界値で必ずテストします。短絡評価を活かして「存在確認 → 詳細条件」の順で安全に。副作用は条件に混ぜず、ブロック {} を常に付けて誤結合を防ぐ。迷ったら「失敗を先に弾く → 成功は最後の else」の形に寄せると読みやすく、保守に強い分岐になります。

タイトルとURLをコピーしました