continue の全体像
continue は「現在の反復(1周)をスキップして、すぐ次の周回へ進む」ための制御文です。ループ本体の途中で「この条件なら残りは処理しなくていい」と判断したときに使います。対象は for、while、do-while。switch では使いません(switch で分岐を止めたいときは break)。
基本的な使い方と動き
反復の残りをスキップする
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue; // ここで 2 の回は残りをスキップ
}
System.out.println(i); // 0,1,3,4 が出力
}
Javacontinue に到達した周回では、その後の文が実行されず、直ちに次の反復へ移ります。for なら「更新式(i++)」へ、while/do-while なら「条件判定」へ戻るのがポイントです。
重要ポイントの深掘り:ガード節としての設計
早めに弾いて、メイン処理をまっすぐに
「対象外を先に弾く→対象だけをまっすぐ処理」という流れにすると、深いネストが減って読みやすくなります。
for (String line : List.of("OK:1", "BAD:x", "OK:2")) {
if (!line.startsWith("OK:")) {
// 対象外はスキップして、次の周回へ
continue;
}
// ここから先は「OK:」前提のシンプルな処理
System.out.println("処理: " + line);
}
Javacontinue は「異常系・対象外」の排除に使い、主処理を左へフラットに並べるための道具だと捉えると安定します。
重要ポイントの深掘り:for/while の違いと副作用
更新式のタイミング(for は更新してから次へ)
for (int i = 0; i < 5; i++) {
if (i == 2) continue; // ここに来たらこの周の残りを飛ばし、i++ へ進む
// 残りの処理
}
Javafor は continue 後に更新式が必ず実行されます。while/do-while は更新処理が自動ではないため、スキップによって「更新漏れ」にならない設計が必要です。
int i = 0;
while (i < 5) {
if (i == 2) {
i++; // 手動で更新を入れてから続行しないと無限ループの恐れ
continue;
}
System.out.println(i);
i++;
}
Java「状態更新をどこで行うか」を明確にするのが無限ループ回避のコツです。
ラベル付き continue(外側の次周へジャンプ)
多重ループで外側の反復を次へ
内側で条件に当たったら「外側の次周へ進みたい」ことがあります。ラベル付き continue なら一発です。
outer:
for (int r = 0; r < 3; r++) {
for (int c = 0; c < 3; c++) {
if (r == 1 && c == 2) {
continue outer; // 外側ループ outer の次の周回へ
}
System.out.printf("(%d,%d)%n", r, c);
}
}
Javaフラグ変数で回りくどく制御するより、意図(「外側の次へ」)が直に伝わるため、読みやすさと安全性が高まります。ラベル名は短く意味が分かるものにしましょう。
break・return との違い(使い分けの軸)
何をスキップ/終了するかが違う
continue: 今の周回の残りだけスキップ。ループは続行。break: そのループ自体を終了。外へ出る。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「どの範囲まで止めたいか」を決めて、最小限の制御文を選ぶのがプロの書き方です。
よくある落とし穴と対策
条件の取りこぼし・更新漏れ
while で continue を使うと、更新や副作用をスキップしてしまい、無限ループや状態不整合の原因になります。更新は「前半(ガード)でも行う」か、「必ず最後に行う」設計に統一しましょう。
乱用でフローが追いづらくなる
あちこちに continue が散在すると、読む人が追いづらくなります。「対象外を先に弾く」ための最小限に留め、複雑なら関数分割や条件を途中変数にして意味を名前に乗せると見通しが改善します.
実用例で身につける
例 1: フィルタ処理(対象外をスキップ)
public class Filter {
public static void main(String[] args) {
String[] lines = {"# comment", "value=1", "", "value=2"};
for (String s : lines) {
if (s.isBlank() || s.startsWith("#")) {
continue; // 空行・コメントをスキップ
}
System.out.println("parse: " + s);
}
}
}
Java例 2: 不正値を除外して集計
public class SumValid {
public static void main(String[] args) {
int sum = 0;
int[] arr = {3, -1, 8, -5, 2};
for (int n : arr) {
if (n < 0) continue; // 不正値は除外
sum += n;
}
System.out.println(sum); // 13
}
}
Java例 3: ラベル付き continue で行スキャンを次へ
public class ScanGrid {
public static void main(String[] args) {
int[][] grid = {{1, 0, 2}, {0, 0, 3}, {4, 0, 5}};
row:
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
if (grid[r][c] == 0) {
continue row; // 0 を見たらその行の次周へ
}
System.out.printf("[%d,%d]=%d%n", r, c, grid[r][c]);
}
}
}
}
Java設計の指針(重要ポイントのまとめ)
continue は「対象外を早めに弾く」ためのガードとして使い、主処理をフラットに保つ。for は更新式が自動で走るが、while/do-while は更新漏れに注意。多重ループではラベル付き continue で外側の次周へ明快にジャンプ。乱用は読みにくさを招くため最小限にし、複雑なら関数分割や途中変数で意図を名前に乗せる。止める範囲に応じて break/return と使い分ける——この基本を押さえれば、continue は読みやすく安全なループ設計の味方になります。
