Javaのcontinue文を徹底解説!基本構文から使い方・breakとの違い・実践例まで

目次

1. はじめに

Javaプログラミングを学ぶ中で、ループ処理は欠かせない基本構文のひとつです。その中でも、「continue」ステートメントは意外と見落とされがちな存在かもしれません。ですが、正しく使いこなせると、コードの可読性や効率を大きく向上させる力を持っています。

「continue」を使うことで、特定の条件を満たした場合にそのループ処理だけをスキップして、次の繰り返し処理へ進むことができます。例えば、配列の中から特定の値だけ処理したくない場合や、無駄な計算を省きたいときに役立つ構文です。

本記事では、「java continue」の基本的な使い方から実践的な活用例、さらには他のループ制御文との違いまで、初心者から中級者の方にもわかりやすく解説します。初めて「continue」を使う方はもちろん、なんとなく知っていたけれど深く理解していなかった方も、この記事を読めば自信を持って活用できるようになるでしょう。

これから、順を追って「java continue」の基礎から応用までを詳しく見ていきましょう。

2. 基本構文と動作の仕組み

「continue」ステートメントは、主に繰り返し処理(ループ)内で利用されます。Javaでは、for文、while文、do-while文など、様々なループ処理の中で「continue」を使用できます。ここでは、基本的な構文とその動作の仕組みについて解説します。

2-1. 「continue」の基本構文

「continue」の記述方法はとてもシンプルです。使い方は以下のようになります。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue; // 条件を満たしたら、このループ処理だけスキップ
    }
    System.out.println(i);
}

この例では、変数iが偶数のときに「continue」が実行され、その回のSystem.out.println(i);がスキップされます。結果として奇数のみが出力されます。

2-2. ループ処理の流れと「continue」の働き

「continue」は、実行されるとそれ以降の処理を飛ばして、すぐに次のループ条件の判定や繰り返し処理へ進みます
以下は、「for」文の処理フローを例にした簡単な流れです。

  1. ループの初期化(例:int i = 0
  2. ループ継続条件の判定(例:i < 10
  3. ループ本体の処理
  4. ループ内で「continue」が実行された場合、以降の処理をスキップ
  5. ループの増分処理(例:i++
  6. 2に戻って繰り返す

このように、「continue」は“いまの処理だけ飛ばす”シンプルな働きを持ちます。複数の条件が重なったり、複雑なループ処理の中でも、明確に“スキップしたいパターン”を制御できるので、コーディングの自由度が高まります。

2-3. どんな時に役立つのか?

例えば「特定の条件に当てはまる場合だけ処理を省略したい」「エラーや不正な値を飛ばして次の処理へ進みたい」といった場面で重宝します。

この後の章では、実際のサンプルコードとともに「continue」の効果的な使い方をさらに詳しく紹介していきます。

3. 実践サンプルコード

ここでは、「continue」を使った具体的なサンプルコードを紹介します。実際の使用例を見ることで、どのような場面で役立つのか、よりイメージしやすくなるはずです。

3-1. for文での利用例:特定の値をスキップ

たとえば、1から10までの数字のうち、3の倍数だけ処理をスキップしたい場合、以下のように記述します。

for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) {
        continue; // 3の倍数の時は出力しない
    }
    System.out.println(i);
}

このコードを実行すると、「3」「6」「9」を除く数字が出力されます。「continue」を使うことで、特定条件に合致した場合のみ、そのループの処理を飛ばして次に進むことができます。

3-2. while文での利用例:入力値のバリデーション

ユーザーから入力を受け付ける場合、不正な値を飛ばして次の入力に進みたいことがあります。例えば、負の数値を無視したい場合は以下のように書けます。

Scanner scanner = new Scanner(System.in);
int count = 0;
while (count < 5) {
    System.out.print("正の整数を入力してください:");
    int num = scanner.nextInt();
    if (num < 0) {
        System.out.println("負の数値は無視します。");
        continue; // 負の値は処理しない
    }
    System.out.println("入力された値:" + num);
    count++;
}

この例では、ユーザーが負の数を入力すると、その回のcount++が実行されず、再度入力を促します。「continue」を使うことで、条件によって処理の流れを柔軟にコントロールできます。

3-3. 拡張for文(for-each)での利用例:コレクション処理

配列やリストなどのコレクションでも、「continue」を活用できます。例えば、文字列のリストから空文字だけをスキップして出力する場合です。

String[] names = {"田中", "", "佐藤", "鈴木", ""};
for (String name : names) {
    if (name.isEmpty()) {
        continue; // 空文字の場合はスキップ
    }
    System.out.println(name);
}

このコードでは、空文字(””)は出力されず、有効な名前だけが表示されます。

このように、「continue」を使うことで、条件ごとに柔軟に処理を分岐させることができます。次章では、「continue」とよく混同されやすい「break」との違いについて詳しく解説します。

4. break との違いを明確に伝える

「continue」とよく比較される制御構文に「break」があります。どちらもループ処理の中で使われますが、動作の違いは明確です。この章では、その違いを分かりやすく解説します。

4-1. 基本的な違い

  • continue
    現在の繰り返し処理(ループ本体)だけをスキップし、次のループへ進む。
  • break
    ループ自体を強制的に終了し、ループの外の処理へ進む。

この違いを意識して使い分けることが、正しいループ制御のポイントです。

4-2. サンプルコードでの比較

【continueの例】
1から10までの数字のうち、偶数だけを出力したい場合:

for (int i = 1; i <= 10; i++) {
    if (i % 2 != 0) {
        continue; // 奇数はスキップ
    }
    System.out.println(i); // 偶数だけ出力
}

出力結果:

2
4
6
8
10

【breakの例】
1から10までの数字のうち、5になったらループを終了したい場合:

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break; // 5になったらループ自体を終了
    }
    System.out.println(i);
}

出力結果:

1
2
3
4

4-3. 使い分けのポイント

  • 一部の繰り返しだけスキップしたい場合は「continue」
  • ループそのものを途中でやめたい場合は「break」

どちらを使うか迷った場合は、「本当にループ自体を終了したいのか」「一時的なスキップで良いのか」を考えると、最適な選択ができます。

「continue」と「break」は、どちらも便利な制御構文ですが、意図しない場所で使うとバグの原因になることもあるため、用途と目的を明確にして使い分けることが重要です。

5. 応用:ラベル付き continue

Javaの「continue」には、ラベル付きcontinueという上級者向けの使い方があります。これは、多重(ネスト)ループの中で“どのループをスキップするか”を明示的に指定できる機能です。正しく使うと複雑な処理をシンプルにできますが、使い方には注意も必要です。

5-1. ラベル付きcontinueの基本構文

まず、ラベル付きの「continue」は、下記のように記述します。

outerLoop: // ← これがラベル
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        if (j == 2) {
            continue outerLoop; // 外側のループ(outerLoop)の次の繰り返しへ
        }
        System.out.println("i=" + i + ", j=" + j);
    }
}

このコードでは、jが2になったタイミングで外側のループ(outerLoop)の次の処理にジャンプします。通常のcontinueなら内側のループだけスキップされますが、ラベルを使うことで“どのループ”に対して作用させるか指定できるのが大きな違いです。

5-2. ラベル付きcontinueの実行例と結果

上記のコードを実行すると、次のような出力になります。

i=1, j=1
i=2, j=1
i=3, j=1

各回、j == 2outerLoopの次の繰り返しへ進むため、「j=2, 3」の出力はすべてスキップされます。

5-3. 使用時の注意点と可読性

ラベル付きの「continue」は多重ループの制御をシンプルにできますが、使いすぎは可読性を損なう原因になります。複雑な処理が必要な場合でも、できるだけ処理を分割したり、メソッド化することでラベルの多用を避けることが推奨されます。

特に、チーム開発や大規模なシステムでは、ラベル付き制御文が多用されていると後から読んだ人が混乱しやすいため、「本当に必要な場合だけ限定的に使う」ことが重要です。

5-4. 無限ループやバグのリスク

ラベル付きの「continue」を使う際は、ループ条件やブロックの構造にも注意が必要です。処理をスキップしすぎて条件が変わらず、意図しない無限ループに陥ることもあるため、特にループ内でのカウンタの増減や条件式の記述には注意しましょう。

ラベル付き「continue」は強力な武器にもなりますが、使い方を誤ると危険な刃にもなります。シンプルで読みやすいコードを心がけ、やむを得ないときだけ使うのが良いでしょう。

6. ベストプラクティス・注意点

「continue」は非常に便利な制御構文ですが、使い方を誤るとコードの可読性や保守性が低下することがあります。ここでは、現場でもよく語られるベストプラクティスや注意点について解説します。

6-1. 「continue」の過度な使用は避ける

「continue」を多用しすぎると、何がスキップされているのか分かりにくいコードになってしまいます。とくに複雑なループや多重ループで頻繁に「continue」を使うと、プログラムの流れが把握しづらくなり、バグやメンテナンスコストの増加につながります。

対策:

  • 複雑な条件は、if文や処理の分割(メソッド化)で整理しましょう。
  • どうしても「continue」が必要な場合は、コメントで意図を明確に記述すると親切です。

6-2. 無限ループを防ぐためのポイント

ループ内で「continue」を使う場合、ループの進行に必要な変数(カウンタなど)の増減処理が「continue」より前に記述されているかを必ず確認しましょう。
たとえば、次のようなコードは無限ループになるリスクがあります。

int i = 0;
while (i < 5) {
    if (i == 2) {
        continue; // iの値が増えず、無限ループに!
    }
    i++;
    System.out.println(i);
}

この場合、iが2のとき「continue」でi++がスキップされるため、iの値が永遠に2のままとなり、無限ループになります。
進行に必要な処理は、なるべく「continue」の前に記述することが大切です。

6-3. チーム開発では特に可読性を意識する

他の人が読むことを前提にしたコードでは、「continue」の使用を最小限にとどめるのが安全です。どうしても使いたい場合は、「なぜこのタイミングでスキップするのか」をコメントで残し、後から見ても迷わないようにしましょう。

6-4. 代替案を検討する

もし条件分岐が複雑になりがちなら、「continue」を使わずに処理の流れを自然な形で記述できないかを一度検討しましょう。たとえば、ガード節(早期リターン)やメソッドの分割、Stream APIの活用なども選択肢です。

「continue」は上手に使えばコードを簡潔にできますが、使いすぎず、シンプルな構造を保つことがプロの現場でも推奨されています。使う前に“本当に必要か?”と一度立ち止まって考える習慣をつけると、より良いコードを書けるでしょう。

7. より洗練された代替案

Javaで「continue」を使うことでコードを簡潔にできますが、最近のJava(Java 8以降)では、より読みやすく、バグの少ない記述方法が選ばれる場面も増えています。この章では、continueを使わずに同じ効果を得る「より洗練された書き方」や、「大規模プロジェクトでの採用判断」について解説します。

7-1. Stream APIによる処理の代替

Java 8から導入されたStream APIを使えば、コレクションや配列の繰り返し処理で「continue」を書かなくても、“条件によるスキップ”を簡単に記述できます。

たとえば、リスト内の空文字をスキップして出力したい場合、従来のfor文+continueでは次のようになります。

String[] names = {"田中", "", "佐藤", "鈴木", ""};
for (String name : names) {
    if (name.isEmpty()) {
        continue;
    }
    System.out.println(name);
}

これと同じ処理をStream APIで書くと、以下のようにさらに直感的に書けます。

Arrays.stream(names)
      .filter(name -> !name.isEmpty())
      .forEach(System.out::println);

このように、filterメソッドで「空文字を除外」し、forEachで出力しています。
可読性も高く、バグの発生しにくい記述方法といえます。

7-2. メソッドの分割で分岐を整理する

複雑な条件分岐やスキップ処理が多くなる場合、処理を小さなメソッドに分割することで、自然に「continue」を使わずに済む場合があります。

for (User user : userList) {
    if (isInvalid(user)) {
        continue;
    }
    process(user);
}

// より良い例
for (User user : userList) {
    if (isValid(user)) {
        process(user);
    }
}

「continue」を使わなくても、肯定条件でメイン処理だけ実行する流れにすれば、コードがよりシンプルで読みやすくなります。

7-3. 大規模開発・チーム開発での判断基準

企業や大規模システムの現場では、“可読性”や“拡張性”が特に重視されます。そのため、「continue」を多用した分岐よりも、

  • Stream API
  • メソッド分割
  • 設計パターンの工夫
    などの“流れが明確で修正しやすい”手法が選ばれる傾向があります。

「continue」は強力な制御構文ですが、新しいJavaの機能や設計手法を取り入れることで、より安全で保守しやすいコードに進化させることができます。ぜひ、「continue」だけに頼らない選択肢も意識してみてください。

8. まとめ

ここまで、「java continue」の基本から応用、ベストプラクティス、そして最新の記述方法まで順を追って解説してきました。この章では、これまでの内容を振り返りつつ、「continue」をマスターするためのポイントを整理します。

8-1. 「continue」の本質を押さえる

「continue」は、現在のループ処理を途中でスキップし、次の反復へ進むための制御構文です。
使いどころを押さえれば、不要な処理を避けてコードの効率化やバグの防止に役立ちます。

8-2. breakとの違いを理解しよう

「break」と「continue」はしばしば混同されがちですが、

  • break:ループ自体を終了させる
  • continue:その回の処理だけを飛ばして次に進む
    という明確な違いがあります。目的によって正しく使い分けることが重要です。

8-3. ベストプラクティスを意識しよう

  • 過度な使用は避ける
  • 無限ループの原因とならないよう注意する
  • コメントを残すなど、後から読んでも分かりやすいコードを心がける

8-4. 新しいJavaの機能や設計も活用する

Java 8以降であれば、Stream APIやメソッド分割など、「continue」以外の手法でも同様の効果を得られます。現代的な記述方法にも触れながら、状況に応じて柔軟に使い分けていきましょう。

8-5. 実践課題・今後の学び

「continue」の使い方を理解したら、ぜひ自分でもコードを書いて、

  • 配列やリストの値を条件ごとにスキップしてみる
  • breakやreturnとの違いを体験してみる
  • Stream APIで同様の処理を実装してみる
    といった実践課題にチャレンジしてみてください。

「continue」は地味ながらも奥が深い機能です。正しく使えば、あなたのJavaプログラムはより洗練されたものになるはずです。今後のプログラミングにも、ぜひ役立ててください。

FAQ(よくある質問)

Q1. 「continue」と「break」の使い分けのコツは何ですか?

A1. 「continue」はループ内の“その回だけ”処理をスキップして次の繰り返しに進みます。一方「break」はループ自体を即座に終了します。処理を飛ばしたいだけなら「continue」、ループを抜けたいなら「break」と覚えると分かりやすいです。

Q2. ラベル付き「continue」はいつ使えばいいのですか?

A2. 多重(ネスト)ループの中で、「内側のループだけでなく外側のループも次に進めたい」といった特殊なケースで使います。ただし、可読性が下がりやすいので、できるだけシンプルなコードで済む場合は通常の「continue」や処理の分割を優先しましょう。

Q3. Stream APIやラムダ式で「continue」と同じことはできますか?

A3. はい、できます。Stream APIのfilterメソッドを使うと、特定の条件で要素を“スキップ(除外)”し、forEachなどで処理できます。よりモダンで読みやすい記述が可能です。

Q4. 無限ループを防ぐためにはどうしたらいいですか?

A4. ループ変数の増減や条件判定が「continue」より前に正しく書かれているかを必ず確認しましょう。「continue」を使うことでカウンタ更新がスキップされることがあり、結果的に無限ループになることがあります。

Q5. 「continue」はパフォーマンスに影響しますか?

A5. 通常の範囲で使う分には「continue」自体が大きなパフォーマンス低下を招くことはありません。ただし、複雑な条件や過度な多用はプログラムの見通しを悪くし、間接的にメンテナンスコストやバグ発生リスクにつながることがあります。

Q6. 実務では「continue」を積極的に使っても問題ありませんか?

A6. 小規模・単純な処理であれば積極的に使っても構いませんが、複雑な分岐や多重ループ、チーム開発では可読性重視のため、極力シンプルなロジックや他の手法(メソッド分割やStream API等)を優先するのがベターです。