紫本第4章見落としまとめ

第4章「繰り返しと制御文の組み合わせ」よくある見落としパターン

📌 はじめに

Day 12で章末問題を解いて気づいた、試験本番でよく引っかかる7つのパターンをまとめました。

これらは「理解していても見落とす」ものばかり。本番試験までに何度も読み返して、読み落としクセ を直しましょう!


パターン1️⃣: do-while文の後のセミコロン

❌ よくある間違い

do {
    System.out.print("*");
} while(false)  // ← セミコロン忘れ!

✅ 正解

do {
    System.out.print("*");
} while(false);  // ← セミコロン必須!

💡 ポイント

  • do-while文の唯一の構文ルール: while()の後に必ずセミコロン
  • while文には要らないが、do-whileには必須
  • try-catch-finallyのfinallyと同じ感覚で間違える

🎯 試験対策

見直しの時に「do-while」が出たら、必ずセミコロン確認


パターン2️⃣: 条件式の中の演算子を見落とし

❌ よくある間違い

int count = array.length;
while(count > 1) {
    System.out.println(array[count]);  // ← "- 1" を見落とした!
}

✅ 正解

int count = array.length;
while(count > 1) {
    count--;  // ← 正確には「array[--count]」で先置デクリメント
    System.out.println(array[count]);
}

💡 ポイント

  • 条件式は「1文字ずつ」読むつもりで読む
  • a = x - b のような「-」を見落としやすい
  • 複雑な式は「全文を読む」まで目を離さない

🎯 試験対策

条件式が複雑なら、式の各要素を指で指しながら読む


パターン3️⃣: 拡張for文の変数は暗黙的にfinal

❌ よくある間違い

for(String s : array) {
    s += "x";  // ← コンパイルエラー!
}

✅ 正解(変更できない)

// 拡張for文の変数は暗黙的にfinal
// つまり「s = ...」も「s += ...」もできない
for(String s : array) {
    System.out.println(s);  // ← 読み取りのみOK
}

💡 ポイント

// これは明示的にfinal指定
for(final String s : array) {
    s += "x";  // ← エラー(上の暗黙的なのと同じ)
}
  • 拡張for文の変数は自動的にfinal属性を持つ
  • +=, -=, ++ などの再代入は全てNG
  • 読み取りと使用のみ可能

🎯 試験対策

拡張for文が出たら、「この変数はfinalか?」を必ずチェック


パターン4️⃣: do-while vs while のコンパイル判定

❌ よくある間違い

// この2つは同じコンパイル結果だと思う
do { System.out.print("*"); } while(false);
while(false) System.out.print("*");

✅ 正解

// do-while: OK ✅ (1回は実行される)
do {
    System.out.print("*");
} while(false);

// 普通のwhile: NG ❌ (コンパイルエラー)
while(false)
    System.out.print("*");  // 到達不可コード!

// while(1 == 2)も同じ NG ❌

💡 ポイント

条件式do-whilewhile
false✅ OK❌ エラー
1 == 2❌ エラー❌ エラー
  • do-while: doの処理は必ず1回実行 → while(false)でもOK
  • while: 条件判定が先 → falseなら到達不可コード = コンパイルエラー
  • ただしdo-whileでもリテラルfalse扱いのリテラル比較はエラー

🎯 試験対策

「do-whileでコンパイルエラーか?」を聞かれたら、リテラル判定が必要


パターン5️⃣: 多次元配列の拡張for文の

❌ よくある間違い

String[][] matrix = {
    {"A", "B"},
    {"C", "D"}
};

for(String s : matrix) {  // ← 間違い! sは String[] です!
    System.out.println(s);
}

✅ 正解

// 1段階目: 配列を取り出す
for(String[] row : matrix) {
    System.out.println(row);  // [A, B] などが出力
}

// 2段階目: 配列の中身を取り出す
for(String[] row : matrix) {
    for(String s : row) {
        System.out.println(s);  // A, B, C, D
    }
}

💡 ポイント

// 1次元配列なら
for(String s : array)       // String を取り出す

// 2次元配列なら
for(String[] row : array)   // String[] を取り出す
for(String s : row)         // String を取り出す
  • 多次元配列では、1段階ずつ型を落とす
  • 「配列の配列」なので、1回目は配列型

🎯 試験対策

多次元配列の拡張forが出たら、型を1段階落とす


パターン6️⃣: スコープ外の変数アクセス

❌ よくある間違い

for(int i = 0; i < 5; i++) {
    // iはここだけ有効
}
System.out.println(i);  // ❌ スコープ外! コンパイルエラー

✅ 正解

int i;  // forの外で宣言
for(i = 0; i < 5; i++) {
    // iはここでも有効
}
System.out.println(i);  // ✅ OK (i = 5)

💡 ポイント

  • 変数は宣言されたブロック内でのみ有効
  • if, for, while のブロック内で宣言した変数は、そのブロックを出たらアクセス不可
  • 外から参照したいなら、ブロックの外で宣言

🎯 試験対策

ループの後で変数を使う問題が出たら、変数の宣言位置をチェック


パターン7️⃣: ラベル付きbreakの動作

❌ よくある間違い

outer: for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        if(i == 1) break;  // ← 内側のループだけ抜ける
    }
}

✅ 正解

outer: for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        if(i == 1) break outer;  // ← 外側のループまで全部抜ける!
    }
}

💡 ポイント

// 実行フロー:
i=0, j=0 → 出力
i=0, j=1 → 出力
i=0, j=2 → 出力
i=1, j=0 → break outer で完全終了
// i=1,j=1 以降は実行されない!
  • break: 最も内側のループだけ抜ける
  • break ラベル: ラベルまで遡って、そこのループを抜ける
  • continue も同じ仕様

🎯 試験対策

ラベル付きbreakが出たら、どこまで抜けるかをトレース


📋 見落とし対策チェックリスト

解答する前に、必ずこれらを確認:

  •  do-while の後のセミコロン ← 書いてる?
  •  条件式は全て読んだ ← 「-b」のような部分を見落とさない
  •  拡張for文の変数はfinal ← 再代入してないか?
  •  do-while と while の判定 ← リテラルfalse判定してる?
  •  多次元配列の型 ← 1段階ずつ落としてる?
  •  変数のスコープ ← ブロック外でアクセスしてないか?
  •  ラベル付きbreak ← どこまで抜けるかトレース?

💪 最後に

これらのパターンは、理解していても見落とす ものばかり。

大事なのは:

  1. 実装で理解する
  2. 問題文を徹底的に読む ← 細部の見落としをなくす
  3. 何度も繰り返す ← パターンを脳に染み込ませる

本番試験までに、これら7つのパターンが 自動的に目に入る 状態にしましょう!

頑張ってください! 🚀✨

2026-04-29 23:16