If 文の全体像
Java の if 文は「条件が true のときだけ処理を実行する」ための最基本の制御構文です。条件は必ず boolean 型(true/false)で、C のように数値を真偽として使うことはできません。構成は「if(必要なら else if の連鎖、最後に else)」で、上から順に評価され、最初に一致した分岐だけが実行されます。
基本形と書き方のルール
最小の書式
int score = 75;
if (score >= 60) {
System.out.println("合格");
}
Java中括弧 {} は「その条件で実行されるブロック」を示します。1 行だけでも必ず {} を付けるほうが安全です。将来の変更で意図せず誤作動するリスクを減らせます。
if-else と 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「上位から下位へ」並べるのが定石です。重複しない判定順にすると、読みやすくバグが減ります。
重要ポイントの深掘り:条件式の作り方
比較と論理の組み合わせ
int age = 20;
boolean isMember = true;
if (age >= 18 && isMember) {
System.out.println("会員特典を適用");
}
Java&&(AND)と||(OR)の「短絡評価」を活かし、左に前提(存在チェックや安否)、右にコストやリスクのある処理前条件を置くと安全です。
デ・モルガンの法則で否定を整理
int x = 15;
boolean inRange = (x >= 10) && (x <= 20);
boolean outOfRange = (x < 10) || (x > 20); // !(x>=10 && x<=20) と同義で読みやすい
Java大きな否定 ! (...) は読みにくくなりがち。肯定形に近づけると理解が速くなります。
null 安全なガード
String name = null;
if (name != null && name.startsWith("J")) {
System.out.println("J で始まる名前");
}
Java「存在確認 → 利用」の順序にすることで NullPointerException を防げます。
重要ポイントの深掘り:可読性と責務分割
条件を途中変数で名前に乗せる
int stock = 12;
boolean enough = stock >= 10;
boolean low = stock <= 2;
if (enough) {
System.out.println("在庫十分");
} else if (low) {
System.out.println("在庫わずか");
} else {
System.out.println("標準在庫");
}
Java「何を問うているか」が変数名で伝わるため、レビューや保守が楽になります。
早期リターン(ガード節)
public static void process(String email) {
if (email == null || email.isBlank()) {
System.out.println("メールが必須です");
return; // ここで終了(早期リターン)
}
// 残りの処理
System.out.println("処理を続行");
}
Java異常系を先に弾くことで、以降のロジックを「前提が満たされているコード」としてシンプルに書けます。
よくある落とし穴と対策
代入と比較の取り違えを避ける
Java では = は代入、== が比較です。if (x = 1) { ... } はコンパイルエラーになります(x = 1 は int で boolean ではない)。比較は必ず == を使い、参照型の内容比較は equals を使います。
String a = "hi", b = new String("hi");
if (a.equals(b)) { // 内容の比較
System.out.println("同じ内容");
}
Java1 行 if の罠を避ける
// 非推奨:中括弧なしは変更に弱い
if (ok)
System.out.println("OK");
// 推奨:常にブロック化
if (ok) {
System.out.println("OK");
}
Java将来、もう 1 行追加したときにブロック化を忘れる事故を防げます。
ネストしすぎを避ける
// 悪い例:深いネスト
if (a) {
if (b) {
if (c) { ... }
}
}
// 良い例:否定で早期リターンして浅く保つ
if (!a) return;
if (!b) return;
if (!c) return;
// ここから本処理
Java浅い構造は読みやすさ・テスト容易性・変更耐性の面で圧倒的に有利です。
実用例で身につける
例 1: 入力検証(必須・長さ・形式)
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上から順に「最も一般的な失敗」→「次の失敗」→「成功」を並べると、読み手が追いやすくなります。
例 2: 料金計算(しきい値の扱い)
public class Pricing {
public static void main(String[] args) {
int age = 65;
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範囲の重なりを避ける順序にすると、境界のバグを防げます。
例 3: フィーチャーフラグ(複数条件の組み合わせ)
public class Feature {
public static void main(String[] args) {
boolean isAdmin = true;
boolean isActive = false;
boolean has2FA = true;
if (isAdmin && isActive && has2FA) {
System.out.println("管理機能を有効化");
} else {
System.out.println("条件を満たしていません");
}
}
}
Java前提(アカウント状態)を左、コストが高い/外部依存のチェックを右へ置くと、評価を最小化できます。
設計の指針(重要ポイントのまとめ)
- 条件は必ず
boolean。比較は==、参照型の内容比較はequals。 if-else if-elseは「上位から下位」へ並べ、重複しないしきい値で設計する。- 短絡評価を活かして「存在確認 → 利用」の順序で例外を防ぐ。
- 可読性最優先。途中変数で条件に名前を付け、早期リターンで浅く保つ。
- 常に
{}を付けて、1 行 if の罠を避ける。
