【Java】if文のネストで起きやすいミスをやさしく解説|else の紐づき・読みづらさを実務目線で整理

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Java の if 文はシンプルですが、
ネスト(入れ子) が増えると一気に難しくなります。

  • else がどの if に紐づくかわからない
  • ブロック {} を省略して意図しない動作になる
  • ネストが深くなりすぎて読めない
  • 条件式の順番でバグが起きる

こうしたミスは、初心者だけでなく実務でもよく発生します。

この記事では、やさしく・実務寄りに
if 文のネストで起きやすいミスを整理していきます。


まずはコードを確認

Java
int score = 80;
boolean isMember = false;

if (score > 70)
    if (isMember)
        System.out.println("特典あり");
    else
        System.out.println("特典なし");

一見正しそうですが、
実は else の紐づき先が意図と違う 可能性があります。


ミス①:else が「直前の if」に紐づく問題(ぶら下がり else)

Java のルール:

else は、常に“直前の if”に紐づく

つまり、次のコードは意図と違う動作になります。

Java
if (score > 70)
    if (isMember)
        System.out.println("特典あり");
    else
        System.out.println("特典なし"); // ← この else は内側の if に紐づく

意図としては:

  • 70点以上なら
    • 会員なら特典あり
    • 会員でなければ特典なし

のつもりでも、実際には:

  • isMember が false のときだけ else が動く
  • score > 70 の条件は外側だけに影響

正しい書き方(必ず {} をつける)

Java
if (score > 70) {
    if (isMember) {
        System.out.println("特典あり");
    } else {
        System.out.println("特典なし");
    }
}

ブロックを省略しない
これが最も安全な書き方です。


ミス②:{} を省略して意図しない行だけ if に入る

Java
if (x > 0)
    System.out.println("OK");
    System.out.println("NG"); // ← if の外

見た目では if の中に見えますが、
実際には NG が常に出力されます。

正しい書き方

Java
if (x > 0) {
    System.out.println("OK");
    System.out.println("NG");
}

ミス③:ネストが深くなりすぎて読めない

Java
if (a) {
    if (b) {
        if (c) {
            if (d) {
                ...

こうなると、
どの条件がどこに対応しているのか
読み手が迷子になります。

実務では「早期 return」で浅くする

Java
if (!a) return;
if (!b) return;
if (!c) return;
if (!d) return;

ネストを浅くすることで、
読みやすく安全なコードになります。


ミス④:条件式の順番で意図しない動作になる

Java
if (obj != null && obj.isValid()) { ... }

これは安全ですが、順番を逆にすると危険です。

Java
if (obj.isValid() && obj != null) { ... } // ← NullPointerException

AND(&&)は左から評価される

null チェックは必ず左側に置く


ミス⑤:else if の代わりに if を並べてしまう

Java
if (score >= 80) {
    System.out.println("A");
}
if (score >= 70) {
    System.out.println("B"); // ← A と B の両方が出る可能性
}

正しい書き方

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

ミス⑥:条件式が複雑すぎて意図が伝わらない

Java
if ((a && b) || (!c && d) || (e && !f && g)) { ... }

書けるけれど、
読む側が理解できない のが最大の問題。

実務では「意味のある変数名」で分解する

Java
boolean isAdult = age >= 20;
boolean hasTicket = ticket != null;
boolean isHoliday = day.isHoliday();

if (isAdult && hasTicket && isHoliday) { ... }

使うときに気をつけたいこと

  • else は直前の if に紐づく(ぶら下がり else に注意)
  • {} を省略しない(最重要)
  • ネストは浅くする(早期 return が有効)
  • null チェックは左側に置く
  • else if を正しく使う
  • 複雑な条件式は分解する

実務では「読みやすさ」が最も大切です。


まとめ

if 文のネストで起きやすいミス

  • else の紐づき先を間違える
  • {} を省略して意図しない動作になる
  • ネストが深くて読めない
  • 条件式の順番で例外が起きる
  • if を並べてしまい、意図しない複数実行
  • 条件式が複雑すぎる

安全に書くためのポイント

  • ブロックは必ず書く
  • ネストは浅くする
  • 条件式は分解する
  • null チェックは左側に置く

decopon
decopon

if 文のネストは、 「書ける」よりも「読める」ことが大切です。特に ぶら下がり else{} の省略 は Java Bronze でも実務でも頻出の落とし穴。ここを押さえておくだけで、 あなたのコードはぐっと読みやすく、安全になります。あなたの学びが、次のステップにつながりますように。

moco
moco

else は“いちばん近い if”にくっつくんだって。
だから {} をつけると、すごく安心して書けるよ。

コメント

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