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 -> "その他";
};
Javafinally は必ず実行される
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 の各 case に break を徹底し、fall-through は意図がある場合だけ使う。多重ループはラベル付き break が最も明快で安全。continue や return と「止める範囲」を軸に使い分ける。長いループで break が増えるなら、早期リターンやメソッド分割でフローを整理する。この流儀を守れば、break はコードをシンプルに保つ強力な相棒になります。
