Javaのcontinue文のやさしい説明
「この回の残りはパス!次の回へいこう」という合図がcontinueです。ループの中で特定の条件に当てはまったときだけ、その回の残り処理をスキップして、すぐ次の繰り返しに進みます。
基本の考え方
- 役割: ループ(for/while)の「今の回」の残りをスキップして、次の回へ進める。
- 直感的なイメージ: 行列で「この人は飛ばして次の人を呼ぶ」感じ。
- よく使う場面: 入力の中から不正な値を除外したい、特定の条件に当てはまるデータだけ飛ばしたい。
for文での例
例1:3の倍数をスキップ
- ポイント: 条件に合えばprintlnを実行せず、次のiへ。
for (int i = 1; i <= 10; i++) {
if (i % 3 == 0) {
continue; // 3の倍数はスキップ
}
System.out.println("i = " + i);
}
Java- 結果イメージ: 1, 2, 4, 5, 7, 8, 10(3, 6, 9は表示されない)
例2:空文字はスキップして処理を軽くする
- ポイント: 無駄な処理を早めに避ける「早期スキップ」。
String[] names = {"Alice", "", "Bob", "", "Carol"};
for (int i = 0; i < names.length; i++) {
if (names[i].isEmpty()) {
continue; // 空文字は飛ばす
}
System.out.println("Hello, " + names[i]);
}
Java- 結果イメージ: Hello, Alice / Hello, Bob / Hello, Carol
while文での例
例3:負の数はスキップして合計を計算
- ポイント: 先にインデックスを進めるのを忘れない(無限ループ防止)。
int[] nums = {5, -2, 7, -1, 3};
int i = 0;
int sum = 0;
while (i < nums.length) {
if (nums[i] < 0) {
i++; // 次へ進める!
continue; // 負の数は合計に入れない
}
sum += nums[i];
i++;
}
System.out.println("sum = " + sum);
Java- 結果イメージ: sum = 15(-2と-1は無視)
breakとの違い
- continue: 今の回の残りを飛ばして「次の回へ」進む。
- break: ループ自体を「完全に終了」する。
例4:違いがわかる短いコード
for (int i = 1; i <= 5; i++) {
if (i == 3) continue; // 3は表示しない
System.out.println(i);
}
// 出力: 1, 2, 4, 5
for (int i = 1; i <= 5; i++) {
if (i == 3) break; // 3でループ終了
System.out.println(i);
}
// 出力: 1, 2
Java多重ループとラベル付きcontinue
- 通常のcontinue: 一番内側のループだけをスキップ。
- ラベル付きcontinue: 指定した外側のループの「次の回」へ直接進む。
例5:外側のループへ飛ぶ
Outer:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if ((i + j) % 2 == 0) {
continue Outer; // 外側のforの次のiへ
}
System.out.println("i=" + i + ", j=" + j);
}
}
Java- ポイント: 「内側の残り+外側の内側の続き」まるごと飛ばして、外側の次の繰り返しへ。
- 注意: ラベルは読みやすさが落ちやすいので、必要なときだけ使う。
よくあるつまずき
- インデックスの更新忘れ: whileでcontinueを使うとき、ループ変数を進めないと無限ループになる。
- 過度なcontinue: ロジックが読みにくくなる。早期returnや条件分岐の整理で置き換えられるなら検討する。
- ネストの深い場所で連発: 条件の分岐構造を見直すサイン。関数に切り出すとスッキリする。
使いどころと避けどころ
- 使いどころ: フィルタリング(不要データの除外)、検証(不正値のスキップ)、軽量化(重い処理の前に早期判定)。
- 避けどころ: 複雑な入れ子での多用、状態管理が絡む長い処理の途中。読みやすさを優先してifの形にするほうが良いことも多い。
練習問題
問題1:偶数だけを合計
- 課題: 配列から偶数だけを合計し、結果を出力する。奇数はcontinueでスキップ。
int[] data = {1, 2, 3, 4, 5, 6};
int sum = 0;
for (int x : data) {
if (x % 2 != 0) {
continue;
}
sum += x;
}
System.out.println(sum); // 12になるはず
Java問題2:空白行を飛ばして行番号付きで表示
- 課題: 行の配列を順に表示し、空白(trim後に長さ0)はcontinueで飛ばす。
String[] lines = {"hello", " ", "world", "", "java"};
int lineNo = 1;
for (String line : lines) {
if (line.trim().isEmpty()) {
continue;
}
System.out.println(lineNo + ": " + line);
lineNo++;
}
Java問題3:二重ループで禁則条件を飛ばす
- 課題: i=1..3, j=1..3で、i*jが偶数になったら外側の次のiへ進む(ラベル付きcontinue)。
Outer:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if ((i * j) % 2 == 0) {
continue Outer;
}
System.out.println("pair: " + i + "-" + j);
}
}
Javaまとめ
- キーワード: 「今の回をスキップして次へ」=continue、「ループ終了」=break。
- 実践のコツ: 早めの条件チェックで無駄を減らし、インデックス更新を忘れない。読みやすさを崩すほど続けて使うなら設計を見直す。
- 一言: 迷ったら「この回だけ飛ばしたい?」と自分に聞いて、YESならcontinueの出番です。
