Java | 基礎文法:break

Java Java
スポンサーリンク

break の全体像

break は「いま実行中の繰り返し(ループ)や switch の処理を、途中でただちに打ち切る」ための制御文です。よく使う場面は「条件を満たした瞬間に探索終了」「エラー検知でそれ以上進まない」「switch で意図しない次の case へ流れるのを防ぐ」です。コードを短く安全にする強力な手段ですが、使いどころと範囲の意識が大切です。


ループでの基本的な使い方

while/for/do-while を途中終了する

break は「現在のループ1つ」を終了します。以降の反復は行われず、ループの外へジャンプします。

for (int i = 0; i < 10; i++) {
    if (i == 3) {
        break;              // i==3 でループを終了
    }
    System.out.println(i);   // 0,1,2 まで表示
}
System.out.println("ここから先はループの外");
Java

検索系のロジックで「見つかったら終わり」を素直に書けます。不要な反復を避けることで、性能と読みやすさが両立します。


switch 文での使い方(重要ポイントの深掘り)

fall-through を止めるための break

switch は一致した case から「次の break まで」実行します。break を忘れると、次の case に処理が流れる(fall-through)ので、初心者は「各 case に必ず break」を習慣化しましょう。

int n = 2;
switch (n) {
    case 1:
        System.out.println("one");
        break;
    case 2:
        System.out.println("two");
        break; // これを忘れると default まで流れる可能性
    default:
        System.out.println("other");
}
Java

複数の case を同じ処理にまとめたいときは、意図的な fall-through を使います(値を並べて最後のブロックで break)。


ラベル付き break(多重ループの脱出)

ラベルで「外側のループ」を一気に抜ける

ネストしたループで「内側で条件が成立したら、外側のループまで終わらせたい」ことがあります。ラベル付き break が最短です。

outer: for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i == 1 && j == 2) {
            break outer;     // 外側ループ outer を終了
        }
        System.out.printf("(%d,%d)%n", i, j);
    }
}
System.out.println("外側ループも終了");
Java

「どのループを抜けるか」を明示できるため、フラグ変数で外側へ伝えるより読みやすく、バグが減ります。ラベル名は処理の意図が伝わる短い名前にしましょう。


break と continue と return の違い(重要ポイントの深掘り)

何を止めるかが違う

  • break: いまのループ(または switch の分岐)を終了して、外へ進む。
  • continue: いまの反復の残りをスキップして、次の周回へ進む(ループは続く)。
  • return: メソッド自体を終了して、呼び出し元へ戻る(ループを含む残りの処理はすべて中止)。
for (int i = 0; i < 5; i++) {
    if (i == 2) continue; // 2 をスキップ
    if (i == 4) break;    // 4 の前でループ終了
    System.out.println(i); // 0,1,3 が出る
}
Java

「どの範囲で止めたいか」を軸に使い分けましょう。早期終了の設計が明快だと、コード全体が読みやすくなります。


よくある落とし穴と安全設計

break の過剰使用で意図が見えなくなる

あちこちに break が散らばると、フローが追いづらくなります。長いループでは「早期リターン(return)でメソッドを分割」や「条件を途中変数にして意図を名前で表現」を検討すると、見通しが改善します。

switch 式(Java 14+)では break を使わない

値を返す switch 式は ->yield を使い、break は不要です。fall-through の心配がありません。

int day = 3;
String label = switch (day) {
    case 1 -> "月";
    case 2 -> "火";
    case 3 -> "水";
    default -> "その他";
};
Java

finally は必ず実行される

break で抜けても、try-finally があれば finally ブロックは必ず実行されます。リソース解放やログ記録は finally に置くのが安全です。


実用例で身につける

例 1: 先頭一致を見つけたら終了(線形探索)

public class FindFirst {
    public static void main(String[] args) {
        String[] names = {"abe", "sato", "suzuki", "sakai"};
        String found = null;
        for (String n : names) {
            if (n.startsWith("sa")) {
                found = n;
                break;            // 見つかったので探索終了
            }
        }
        System.out.println(found); // "sato"
    }
}
Java

例 2: 入力をチェックして異常なら抜ける

public class ValidateLoop {
    public static void main(String[] args) {
        String[] lines = {"OK:1", "OK:2", "BAD:x", "OK:3"};
        for (String line : lines) {
            if (!line.startsWith("OK:")) {
                System.out.println("異常行を検知: " + line);
                break; // これ以上処理しない
            }
            System.out.println("処理: " + line);
        }
    }
}
Java

例 3: ラベル付き break で二重ループを抜ける

public class NestedExit {
    public static void main(String[] args) {
        int target = 42;
        int[][] grid = {{1, 2, 3}, {10, 42, 7}, {8, 9, 10}};
        found:
        for (int r = 0; r < grid.length; r++) {
            for (int c = 0; c < grid[r].length; c++) {
                if (grid[r][c] == target) {
                    System.out.printf("found at (%d,%d)%n", r, c);
                    break found; // 外側ループまで抜ける
                }
            }
        }
    }
}
Java

設計の指針(重要ポイントのまとめ)

break は「その場の繰り返しや switch をすぐ終わらせる」ための最短距離。switch の各 casebreak を徹底し、fall-through は意図がある場合だけ使う。多重ループはラベル付き break が最も明快で安全。continuereturn と「止める範囲」を軸に使い分ける。長いループで break が増えるなら、早期リターンやメソッド分割でフローを整理する。この流儀を守れば、break はコードをシンプルに保つ強力な相棒になります。

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