else 文の役割と基本
else 文は、if の条件が false のときに実行する「もう一方の手」を明示します。分岐は「A ならこうする、そうでないなら別のこうする」という二者択一をシンプルに書けるのが強みです。else は常に直前の if に結びつき、評価は上から順に行われ、最初に一致したブロックだけが実行されます。可読性と安全性のために、1 行でも必ず {} を付けるのが定石です。
int score = 55;
if (score >= 60) {
System.out.println("合格");
} else {
System.out.println("不合格");
}
Javaelse if 連鎖と「上から下へ」の設計
連続条件の表現
複数の条件分けは else if を連ねます。判定は上から評価され、最初に一致したブロックで終了します。重複や抜けがないよう「上位から下位へ」順序付けするのがコツです。
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この並び方なら、70 台は必ず B、60 台は必ず C のように境界が綺麗に分かれます。else は「どれにも当てはまらないときの最後の受け皿(デフォルト)」です。
重要ポイントの深掘り:ブロックと結びつき
ダングリング else(結びつきの誤解を避ける)
else は「直前の、対応する if」に結びつきます。インデントだけではなく、構文で決まります。誤解を防ぐため、必ず {} を使います。
// 悪い例(中括弧なしは誤解を生む)
if (ok)
if (ready)
System.out.println("Go");
else
System.out.println("Stop");
// 良い例(常にブロック化)
if (ok) {
if (ready) {
System.out.println("Go");
} else {
System.out.println("Stop");
}
}
Java1 行 else の罠を避ける
将来、処理が増えたときに意図せず動作が変わる事故を防ぐため、if も else も常にブロックで書きます。「読みやすさ>短さ」が基本方針です。
else の代替と使い分け(設計視点)
早期リターンで else を減らす
「異常系を先に弾く」ガード節を使うと、ネストが浅くなり else を減らせます。主要ロジックが左にフラットに並び、読みやすく保守しやすい形になります。
public static void process(String email) {
if (email == null || email.isBlank()) {
System.out.println("メールは必須です");
return; // 早期終了
}
// 以降は email が有効である前提の本処理
System.out.println("処理を続行");
}
Java三項演算子との比較(値を選ぶだけなら)
「分岐で値を選ぶだけ」なら三項演算子 ?: が簡潔です。ただし処理が複雑なら if-else に戻します。
int score = 85;
String label = (score >= 60) ? "合格" : "不合格";
System.out.println(label);
Javaswitch の適材適所
多岐分岐(定数や列挙値に応じた分岐)は switch が読みやすい場合があります。文字列や列挙での分岐は switch、範囲判定は if-else if が向いています。
よくある落とし穴と対策
条件の重複・抜け
else if の順序が不適切だと、上位条件に飲み込まれて後段が実行されないことがあります。範囲・順序を「上から下へ」設計し、境界値テストを必ず行います。
int age = 18;
int price;
if (age < 6) {
price = 0;
} else if (age <= 18) { // 6〜18
price = 500;
} else if (age >= 65) {
price = 700;
} else {
price = 1000;
}
Java副作用を条件内に混ぜない
if ((x = f()) > 0) { ... } のように代入・更新を条件に混ぜると、読み手が意図を誤解します。更新は更新、判定は判定で分けて書きます。
実用例で身につける
例 1: 入力検証の受け皿(else でメッセージ)
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 が成功時の処理」という形は、読み手が期待どおりに追える定番パターンです。
例 2: 料金テーブル(明確なデフォルト)
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「どれにも当てはまらない場合」の明確なデフォルトを else に置くと、仕様の網羅がはっきりします。
例 3: ネストを避ける設計(早期リターン)
public class Access {
public static void main(String[] args) {
boolean isAdmin = true;
boolean isActive = false;
if (!isAdmin) {
System.out.println("管理者のみです");
return;
}
if (!isActive) {
System.out.println("無効なアカウントです");
return;
}
System.out.println("ようこそ、管理画面へ");
}
}
Javaelse を使わずとも、ガード節で意図が明確な分岐を作れます。
設計の指針(重要ポイントのまとめ)
else は「そうでない場合」を明快に示す受け皿です。else if は上から順に、重複しないしきい値で設計し、最後の else にデフォルトを置くと読みやすく安全です。ブロック {} を常に付け、ダングリング else の誤解を防ぎます。副作用は条件に混ぜず、異常系は早期リターンで弾くとネストが浅く保てます。値の選択だけなら三項演算子、定数分岐は switch を使い分ける——この基本を身につければ、else はコードの意図を短く確実に伝える味方になります。
