else if の全体像
else if は「複数の条件を上から順に評価して、最初に一致した処理だけを実行する」ための構文です。if と else の間に挟み、分岐を段階的に重ねられます。評価は上から下へ直列で行われ、どれかが 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」の形に寄せると読みやすく、保守に強い分岐になります。
