第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-while | while |
|---|---|---|
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 ← どこまで抜けるかトレース?
💪 最後に
これらのパターンは、理解していても見落とす ものばかり。
大事なのは:
- 実装で理解する
- 問題文を徹底的に読む ← 細部の見落としをなくす
- 何度も繰り返す ← パターンを脳に染み込ませる
本番試験までに、これら7つのパターンが 自動的に目に入る 状態にしましょう!
頑張ってください! 🚀✨