Java | 基礎文法:if 文

Java Java
スポンサーリンク

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 = 1intboolean ではない)。比較は必ず == を使い、参照型の内容比較は equals を使います。

String a = "hi", b = new String("hi");
if (a.equals(b)) { // 内容の比較
    System.out.println("同じ内容");
}
Java

1 行 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 の罠を避ける。

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