はじめに
Javaのcontinueは、for、while、do-whileの途中で現在の周回だけを終え、次の判定へ進めるための制御文です。そのため、条件に合わないデータを読み飛ばす処理、入力値の検査、一覧から不要な要素を除外する処理で使われます。
プログラミング初心者がつまずきやすいのは、breakとの違い、whileでの更新漏れ、ネストしたループで作用する範囲です。これらを整理すると、continue文の使い方、応用例、注意点、対処法、カスタマイズの判断がしやすくなります。
公式ドキュメントによれば、continueはループ文の本体内で使うジャンプ文として扱われますし、ここがポイントです。仕様の根拠を確認したい場合は、OracleのJava Language Specification 14.16 The continue Statementと、標準ライブラリの文脈ではStream API公式ドキュメントが一次情報になります。
関連する基礎を補う場合は、配列やコレクションの扱いをJava List型完全ガイド、注釈の文法をJavaアノテーションの解説、条件分岐の練習をJavaでうるう年を判定する解説、文字列処理をJavaエスケープ処理の解説、継承の理解をJavaオーバーライドの解説で確認できます。
- Java SE 21 / OpenJDK 21
- 標準ライブラリのみ使用、サンプルは単一クラスのコンソールプログラム
- continue文が現在の周回だけをスキップする仕組み
- for、while、do-while、拡張forでの安全な使い方
- break文、ラベル、Stream APIとの使い分け
- プログラミング初心者が避けたい注意点と対処法
- 条件式やメソッド化によるカスタマイズの考え方
Javaとは
Javaは、クラスを中心にプログラムを構成するオブジェクト指向言語です。ソースコードは.javaファイルとして書き、javacで.classへコンパイルし、javaコマンドでmainメソッドを起点に動かします。
一般に、Javaの学習ではif、switch、for、while、returnなどの制御構文を早い段階で扱います。その制御構文の中で、ループ制御を細かく調整する役割を持つのがcontinueとbreakです。
Javaの基本概念
Javaのコードはclassにまとめられ、処理はmethodの中に書かれますが、これは押さえたい点です。そのため、continue文も単独で存在するのではなく、public static void main(String[] args)のようなメソッド内のループ本体に置かれます。
このとき、変数はint、boolean、String、Listなどの型を持ち、条件式の結果がtrueになると分岐が動きます。continue文はその条件分岐と組み合わせることで、処理対象を選別するためのループ制御になるのが基本です。
Javaでよく使われる制御文
Javaの制御文には、条件で流れを変えるifとswitch、繰り返しを作るfor、while、doがあります。これらにcontinueやbreakを組み合わせると、繰り返しの中で不要な処理を避けたり、処理全体を打ち切ったりできます。
使い分けると、continueは現在の周回だけを終える制御、breakはループそのものを終える制御です。プログラミング初心者は、この差を出力例で確認すると、ループ制御の挙動を誤解しにくくなるのが目安です。
💡 Tips:continueは「残りの処理を読ませない」構文です。条件に合わないデータを早めに除外すると、深いifの入れ子を減らせます。
| 構文 | 主な役割 | continue文の動き | 注意点 | 主な用途 |
|---|---|---|---|---|
for | 回数が明確な反復 | 更新式へ進む | 条件式と更新式の順序を把握する | 番号付き処理 |
while | 条件が続く間の反復 | 条件判定へ戻る | 更新漏れで無限ループになりやすい | 入力監視 |
do-while | 少なくとも一度動く反復 | 末尾の条件判定へ進む | 更新位置を先に決める | 再試行処理 |
enhanced for | 配列やコレクションの走査 | 次の要素へ進む | インデックスが必要なら通常のforを選ぶ | 一覧処理 |
labeled continue | 外側ループへ進む | 指定ラベルの次周回へ進む | 読み手に意図が伝わる名前にする | 多重ループ |
break | ループ終了 | continue文とは別の制御 | スキップではなく終了になる | 探索の打ち切り |
Stream.filter | 条件に合う要素の抽出 | continue文は直接使わない | 副作用のある処理に向かない | リスト変換 |
try-catch | 例外時の分岐 | 失敗した周回を飛ばせる | 例外の握りつぶしを避ける | 読み込み処理 |
continue文の基本
結論として、continue文は「条件に合った周回だけを途中で切り上げる」ために使います。最小の例では、偶数のときだけSystem.out.printlnへ到達させず、奇数だけを表示対象にできます。
結果: 期待される出力は、奇数だけが1行ずつ表示される形です。
このコードでは、i % 2 == 0がtrueになる偶数の周回で、下にある出力処理へ進みません。そのため、forの更新式i++へ移り、次の値を処理します。
結果: 期待される出力例では、0、2、4、6、8が除外されます。
その挙動は、条件に合わないデータを処理対象から外す使い方に向いているのがポイントです。一方、除外条件が多すぎると読み手が流れを追いにくくなるため、後半の注意点と対処法で整理します。
continue文とは
continue文は、ループ本体の残りをスキップし、次の反復へ移す文です。forでは更新式、whileでは条件式、do-whileでは末尾の条件式へ流れます。
ただし、メソッドから抜けるreturnや、ループを終了するbreakとは効果が異なるのが一般的です。continue文の使い方は、周回単位で処理を除外する場面に限定して考えると整理できます。
基本的な使い方
基本形は、ループの先頭付近にifを置き、除外したい条件でcontinueを実行する書き方です。この配置にすると、下側に残る処理が「実際に扱う対象」だけになり、読みやすい構造になります。
具体的には、入力値が空、数値が範囲外、リスト要素がnullといった場合に早く次へ送れますし、これが一つの目安です。その処理はguard clauseに近い考え方で、ネストを浅くするカスタマイズにもつながります。
continue文の詳細な使い方
continue文の詳細な使い方は、ループの種類ごとに次へ進む位置が変わる点を押さえると理解しやすくなります。特にwhileとdo-whileは、カウンタ更新の位置を誤ると同じ条件を繰り返すため注意点が増えますが、覚えておくと役立つでしょう。
サンプルコード1:forループでの使用例
forループでは、continue文の後に更新式が処理されます。そのため、カウンタを増やすi++がforの括弧内にある場合、スキップしても次の値へ進みます。
結果: 期待される出力では、iが2の行だけ表示対象から外れますし、ここを基本と考えるとよいでしょう。
このとき、i == 2の周回ではSystem.out.printlnに到達しません。ただし、forの更新式は通るため、次の周回はi == 3から続きます。
結果: 期待される出力例では、iの値は 2が含まれません。
サンプルコード2:whileループでの使用例
whileループでは、更新処理を本体内に書くため、continue文より前に必要な更新を済ませる設計が必要です。その更新を忘れると、同じ値で条件判定に戻り、抜けられない処理になります。
結果: 期待される出力では、2だけが読み飛ばされ、処理は4まで進みます。
この例の対処法は、continueの直前でi++を実行することです。プログラミング初心者は、whileでcontinue文を使うときに「条件を変える処理が先にあるか」を確認すると安全です。
結果: 期待される出力例では、iの値は 2が表示されません。
サンプルコード3:do-whileループでの使用例
do-whileループは、本体を処理した後に条件を判定します。そのため、continue文が実行されても末尾のwhile条件へ進み、そこで継続可否が決まります。
結果: 期待される出力では、iが2の周回だけ出力が省かれます。
このときも、i++をcontinueの前に置く点が対処法になります。逆に更新を下だけに置くと、i == 2から抜けられないため、注意点として覚えるとよいです。
結果: 期待される出力例では、iの値は 2が除外されますし、ここがポイントです。
サンプルコード4:ネストしたループでの使用例
ネストしたループでは、ラベルなしのcontinue文は最も内側のループに作用します。外側のiを進めたいのか、内側のjだけを進めたいのかを分けることが、ループ制御の注意点になります。
結果: 期待される出力では、各iに対してj = 2の行だけが省かれます。
この例では、continueが内側のforにだけ効きます。そのため、外側のiは同じまま、内側のjが次の値へ進みますが、これは押さえたい点です。
結果: 期待される出力例では、j = 2を含む組み合わせが出力されません。
continue文の応用例
continue文の応用例では、単純な数値スキップだけでなく、複数条件、配列、break文との併用を扱います。実装パターンとしてよく見るのは、処理対象外のデータを早めに除外して、下側の本処理を読みやすく保つ書き方です。
サンプルコード5:条件に応じて処理をスキップ
複数の除外条件がある場合は、||や&&で条件式を組み立てます。この使い方では、条件を読むだけで「何を対象外にするか」が分かる形にすると保守しやすくなるのが現実的です。
結果: 期待される出力では、2または3で割り切れる数が対象外になります。
この条件式では、偶数に加えて3の倍数もスキップします。そのため、表示されるのは1、5、7、9です。
結果: 期待される出力例では、0、2、3、4、6、8、10が出力されません。
サンプルコード6:配列から特定の要素を除外
配列やリストを走査するときも、continue文は特定要素の除外に使えます。拡張forループではint num : arrayの形で各要素を受け取り、条件に合う要素だけを読み飛ばします。
結果: 期待される出力では、配列要素のうち3だけが除外されますし、これが一つの目安です。
この応用例は、禁止値、欠損値、処理対象外のコードを除く処理に近い形です。ただし、元の配列から要素を削除しているわけではなく、出力処理を通さないだけだと理解できます。
結果: 期待される出力例では、配列の要素: 3が含まれません。
サンプルコード7:複数の条件でスキップ
複数条件のスキップは、業務コードでも見かける使い方です。条件を増やすほど読みづらくなるため、isSkipTargetのようなメソッドへ切り出すカスタマイズも候補になります。
結果: 期待される出力では、偶数または5で割り切れる値が表示対象から外れますが、覚えておくと役立つでしょう。
この例では、||で結んだどちらかの条件が成り立てばcontinueが動きます。そのため、10のように両方の条件に合う値も同じく除外されます。
結果: 期待される出力例では、奇数であり、かつ5の倍数ではない値だけが残りますし、ここを基本と考えるとよいでしょう。
サンプルコード8:continue文とbreak文の併用
continue文とbreak文を併用すると、スキップと終了を同じループ内で扱えます。一方、条件の順序で結果が変わるため、先に終了条件を見るのか、先に除外条件を見るのかを明確にします。
結果: 期待される出力では、5に到達する前の奇数だけが表示されます。
このコードでは、i == 5が成立するとループ自体が終わります。その前の偶数はcontinueで出力を通らないため、結果は1と3だけになると整理できます。
結果: 期待される出力例では、5以降の値はbreakにより処理されません。
continue文のより高度な応用例
より高度な応用例では、ラベル付きcontinue、リファクタリング、Stream API、例外処理との組み合わせを扱います。これらはすべて同じ目的ではなく、読みやすさ、処理範囲、データ変換の書き方に応じて選ぶものです。
サンプルコード9:ラベルを使用した例
ラベル付きcontinueでは、outer:のようにループへ名前を付け、continue outerで外側の次周回へ移ります。通常のcontinue文と違い、作用するループを明示できる点が特徴です。
結果: 期待される出力では、各外側ループでjが1の行だけが表示されます。
このコードでは、j == 2になった時点で内側の残りを飛ばし、外側のiを次へ進めます。ラベル名はouterよりも、実際の目的に近い名前へカスタマイズすると読みやすくなると覚えるとよいでしょう。
結果: 期待される出力例では、j: 2とj: 3を含む行が表示されません。
サンプルコード10:continue文でリファクタリング
深いifの入れ子は、条件が増えるほど読みにくくなります。continue文をガード条件として使うと、対象外を先に除外し、下側に本来の処理だけを残せます。
結果: 期待される出力は、偶数のうち4と8を除いた値です。
この書き方は条件の意味は正しいものの、内側のifまで読まないと出力対象が分かりません。そのため、除外条件を先に並べる形へ変えると、処理の意図が前半で分かります。
結果: 期待される出力は、リファクタリング前と同じ値の並びです。
この形では、奇数を除外し、次に4と8を除外し、残った値だけを出力します。ただし、1行のifはチームの規約によって波括弧を付ける書き方が選ばれることもあります。
結果: 期待される出力例では、偶数のうち4と8だけが除外されますし、ここがポイントです。
サンプルコード11:ストリーム処理での使用例
Stream APIのfilterでは、continue文そのものは使いません。代わりに、条件に合う要素だけを通すことで、ループ内のcontinue文に近い「除外」の動きを表現します。
結果: 期待される出力は、奇数かつ8未満のリストです。
この例では、stream()、filter()、collect()、Collectors.toList()を連結しています。配列やリストを変換する応用例では、continue文よりStreamのほうが処理意図を短く表せる場合があります。
結果: 期待される出力例では、偶数と8以上の値がリストから除かれますが、これは押さえたい点です。
サンプルコード12:エラーハンドリングとの組み合わせ
例外処理と組み合わせると、失敗した周回だけを記録して次へ進められます。ただし、catchで原因を捨てると調査が難しくなるため、ログやメッセージを残す対処法を併用します。
結果: 期待される出力では、i == 2の周回でエラーメッセージが表示され、次の周回へ進みます。
この使い方は、複数データを順に処理し、一部だけ失敗しても全体を止めたくない場面に合います。一方、致命的な例外までcontinue文で流すと不具合を見逃すため、例外の種類を限定する設計が必要です。
結果: 期待される出力例では、処理を実行: 2は表示されません。
注意点と対処法
注意点と対処法を整理すると、continue文は書ける場所よりも「読める条件」に気を配る必要があると考えられます。特にプログラミング初心者は、条件の重複、更新漏れ、ラベルの乱用、例外の握りつぶしを確認すると、ループ制御の事故を減らせます。
continue文の誤用
同じループ内に似た条件のcontinue文が並ぶと、どの値が除外されるのか追いにくくなります。この場合は、条件をまとめるか、条件名を持つメソッドへ分けるのが現実的です。
結果: 期待される出力では、偶数と3が除外されますし、これが一つの目安です。
このコードは動きますが、除外条件が分散しています。そのため、後から条件を追加するときに重複や抜けが起きやすくなります。
結果: 期待される出力は、1、5、7、9です。
この修正では、除外条件を1つのifにまとめていると言えるでしょう。条件が長くなる場合は、boolean skip = i % 2 == 0 || i == 3;のように名前を付ける対処法もあります。
パフォーマンスへの影響
continue文そのもののコストを過度に恐れる必要はありません。一方、内側ループで重い条件判定や入出力を繰り返すと、continue文ではなく周辺処理が処理時間を押し上げます。
結果: 期待される動きは、内側ループでjが100の倍数の周回だけ本処理を通さない形です。
このような多重ループでは、条件判定の位置と回数を確認するのが基本です。処理対象を事前に絞れるなら、ループ前のデータ加工やStream.filterを使う対処法も検討できます。
可読性とメンテナンス
可読性を保つには、continue文の直前にある条件が明確であることが欠かせません。コメントは不足した意図を補う手段ですが、条件名やメソッド名で意味を表せるなら、そのほうが変更に強い書き方になります。
結果: 期待される出力は、1、3、5、7、9です。
この程度の条件なら、コメントなしでも意味は読み取れますが、覚えておくと役立つでしょう。ただし、業務ルールに基づく複雑な除外条件では、isInvalidOrder(order)のようなメソッド化が対処法になります。
whileでcontinue文を使う場合は、条件を変える処理がcontinueより前にあるか確認します。無限ループの多くは、この更新漏れから発生するのが目安です。カスタマイズ方法
カスタマイズでは、continue文をそのまま書くだけでなく、除外条件をメソッド化したり、拡張forループやStream APIへ置き換えたりします。使い方を選ぶ基準は、処理対象を変更するのか、表示だけを飛ばすのか、別のリストを作るのかという違いです。
サンプルコード13:カスタムライブラリでの使用
共通の除外処理は、メソッドとして切り出すと再利用しやすくなります。この応用例では、対象値を除いた新しいList<Integer>を返すfilterOutメソッドを作りますし、ここを基本と考えるとよいでしょう。
結果: 期待される動きは、targetと一致しない値だけをresultへ追加する形です。
このメソッドは、元のnumbersを直接変更せず、新しいリストを返します。そのため、呼び出し側では元データを残したまま、除外後のデータを扱えます。
結果: 期待される出力は、[1, 2, 4, 5]です。
サンプルコード14:拡張forループとの組み合わせ
拡張forループは、配列やコレクションの全要素を順番に処理する書き方です。インデックスが不要な場合は、通常のforよりも対象データに集中できます。
結果: 期待される出力は、1、3、5です。
この使い方では、number % 2 == 0で偶数を除外しています。インデックス番号が必要になった場合は、拡張forではなく通常のfor (int i = 0; ...)へ戻す判断が扱いやすいです。
サンプルコード15:ラムダ式との組み合わせ
ラムダ式とStream APIを使うと、除外条件をfilterに書けるのがポイントです。continue文を直接書くわけではありませんが、リストから条件外の要素を落とすカスタマイズとして使えます。
結果: 期待される出力は、[1, 3, 5]です。
このコードでは、n -> n % 2 != 0がtrueになる要素だけを残します。一方、途中で複雑な副作用を起こす処理なら、Streamより通常のループとcontinue文のほうが読みやすい場合があります。
まとめ
Javaのcontinue文は、現在の周回だけをスキップし、次の反復へ進めるためのループ制御です。breakのようにループ全体を終えるわけではないため、条件に合わないデータだけを除外したい処理に向いているのが一般的です。
その使い方は、forなら更新式へ、whileなら条件判定へ、do-whileなら末尾の条件判定へ進むという違いで整理できます。特にwhileでは更新漏れが起きやすいため、continue文より前に状態を変える処理があるかを確認します。
応用例としては、複数条件の除外、配列やリストの走査、break文との併用、ラベル付きcontinue、例外処理との組み合わせがあるのが現実的です。注意点と対処法を踏まえるなら、条件をまとめる、メソッド化する、Stream APIへ置き換えるといったカスタマイズが選択肢になります。
プログラミング初心者は、continue文を「残りの処理を飛ばす文」と覚えたうえで、出力対象がどこで決まるのかをコード上で追うと理解しやすくなります。ループ制御の意図が読み取れる形に整えることが、保守しやすいJavaコードにつながりますし、ここがポイントです。
関連記事
- Java List型完全ガイド!初心者でもマスターできる7つのステップ
- Javaアノテーションの12選!初心者から上級者まで徹底ガイド
- Javaでうるう年を判定!初心者でも分かる9ステップ解説
- Javaエスケープ処理の10ステップマスターガイド
- Javaでマスターする!オーバーライドのたった7つのステップ
※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。


