COBOLで「何もしない」ことを明示する命令がCONTINUE文です。EVALUATE文のWHEN OTHERで使うのが最もよく知られていますが、IF文・PERFORM文・その他の文脈でも有効です。また旧来のCOBOLコードには「NEXT SENTENCE」という似た用途の命令が登場しますが、CONTINUEとは動作が根本的に異なり、使い誤ると予期しないバグの原因になります。
この記事ではCONTINUE文の正確な動作・NEXT SENTENCEとの違い・EVALUATE/IF/PERFORMでの活用パターン・「何もしない」が設計上有効な場面を網羅します。EVALUATE文の構文全体(THRU・ALSO・EVALUATE TRUE・88レベル活用)についてはEVALUATE文完全ガイドをご覧ください。
- CONTINUE文の正確な動作(何もせず次の文へ進むだけ)
- NEXT SENTENCEとCONTINUEの致命的な違い
- EVALUATE文でCONTINUEを使う全パターン(WHEN OTHER・特定条件スキップ・プレースホルダー)
- IF文でCONTINUEを使って可読性を上げるパターン
- 「何もしない」が設計上必要になる場面と正しい使い分け
- 許容エラー処理・レコードフィルタリング・状態マシンの実践パターン
CONTINUE文とは
CONTINUE文は「何も処理せず次の文へ進む」だけの命令です。他言語でいうno-op(ノーオペレーション)に相当します。
* CONTINUE文の構文
CONTINUE.
* どの文脈でも使用できる
IF 条件
CONTINUE *> 何もしない(次の文へ)
END-IF
EVALUATE 変数
WHEN 値
CONTINUE *> 何もしない
WHEN OTHER
CONTINUE *> 何もしない
END-EVALUATE
| 項目 | 説明 |
|---|---|
| 動作 | 何もせず、次の文(CONTINUE直後の文)へ制御が移る |
| 使える場所 | IF・EVALUATE・PERFORM・SEARCH・その他あらゆる文脈で使用可能 |
| 用途 | ①空のWHEN/ELSEブランチの明示 ②将来の実装のプレースホルダー ③条件の否定を避けた可読性向上 |
| COBOL標準 | COBOL 85以降の標準規格。すべての現代COBOLコンパイラで使用可能 |
NEXT SENTENCEとCONTINUEの違い(非常に重要)
旧来のCOBOLコードにはNEXT SENTENCEという命令があり、「何もしない」目的で使われていましたが、CONTINUEとは動作が根本的に異なります。混同すると深刻なバグになります。
| 命令 | 動作 | 制御の移動先 | 評価 |
|---|---|---|---|
| CONTINUE | 何もせず次の文へ進む | CONTINUE直後の命令が実行される | 現代COBOLの推奨 |
| NEXT SENTENCE | 次のピリオド(.)の後の文へジャンプ | ピリオドまでの命令をすべてスキップしてしまう | COBOL 2002で非推奨(deprecated) |
COBOLでは
.(ピリオド)がセンテンスの終端です。NEXT SENTENCEはIF/EVALUATEブロックの途中に置かれた場合、そのブロック全体を飛び越えて最寄りのピリオドの後へ移動します。END-IF・END-EVALUATEの後まで含む大きなブロックをまるごとスキップする恐れがあり、「動いているように見えるが実は処理が抜けている」バグを生みやすいです。新規コーディングではNEXT SENTENCEを使わずCONTINUEを使いましょう。 WORKING-STORAGE SECTION.
01 WS-FLAG PIC X VALUE 'N'.
01 WS-COUNT PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
*=== NGパターン: NEXT SENTENCEの意図しない動作 ===
IF WS-FLAG = 'N'
NEXT SENTENCE *> 次のピリオド(.)まで全部スキップ!
ELSE
DISPLAY 'フラグあり'
END-IF
ADD 1 TO WS-COUNT. *> ← このピリオドまで飛ぶ!
* 上記で WS-FLAG = 'N' なら ELSE句の DISPLAY も
* ADD 1 TO WS-COUNT も実行されずにピリオドの後へ!
*=== OKパターン: CONTINUEを使う ===
IF WS-FLAG = 'N'
CONTINUE *> 何もせず次の文(ADD)へ進む
ELSE
DISPLAY 'フラグあり'
END-IF
ADD 1 TO WS-COUNT *> ← WS-FLAG='N' でも実行される
STOP RUN.
EVALUATE文でのCONTINUE活用パターン
WHEN OTHERでCONTINUEを使う(最も一般的な用法)
EVALUATE文でいずれの条件にもマッチしなかった場合に「何もしない」ことを意図として明示します。WHEN OTHERを省略しても動作は同じですが、CONTINUEを書くことで「意図的に何もしない」という設計意図が読む人に伝わります。
*=== WHEN OTHER省略 ===
* 動作は同じだが「他のケースを考慮していないかもしれない」と読める
EVALUATE WS-STATUS-CODE
WHEN '00' PERFORM NORMAL-PROCESS
WHEN '01' PERFORM WARNING-PROCESS
WHEN '02' PERFORM ERROR-PROCESS
END-EVALUATE
*=== WHEN OTHER CONTINUE ===
* 「00/01/02以外は意図的に無視する」設計意図が明確
EVALUATE WS-STATUS-CODE
WHEN '00' PERFORM NORMAL-PROCESS
WHEN '01' PERFORM WARNING-PROCESS
WHEN '02' PERFORM ERROR-PROCESS
WHEN OTHER CONTINUE *> 03以降は想定内だが処理不要
END-EVALUATE
特定条件をスキップする(CONTINUE + WHEN)
特定の値にマッチしたときだけ何もしない(処理をスキップする)パターンです。ほかの値には処理があり、その特定の値だけ例外的に無視したい場合に使います。
WORKING-STORAGE SECTION.
01 WS-TRANS-TYPE PIC X(2).
88 TYPE-CANCEL VALUE '09'. *> キャンセルトランザクション
88 TYPE-TEST VALUE '99'. *> テストデータ
PROCEDURE DIVISION.
EVALUATE WS-TRANS-TYPE
WHEN '01'
PERFORM INSERT-PROCESS
WHEN '02'
PERFORM UPDATE-PROCESS
WHEN '03'
PERFORM DELETE-PROCESS
WHEN '09'
CONTINUE *> キャンセル済みは何もしない(スキップ)
WHEN '99'
CONTINUE *> テストデータは何もしない(スキップ)
WHEN OTHER
PERFORM UNKNOWN-TYPE-ERROR
END-EVALUATE
将来実装のプレースホルダーとして使う
設計段階やフェーズ1実装でWHEN句を先に作り、処理は後で実装する場合にCONTINUEを仮置きします。処理が未実装であることが明確になり、コンパイルも通ります。
EVALUATE WS-PROCESS-PHASE
WHEN 1
PERFORM PHASE1-PROCESS *> フェーズ1: 実装済み
WHEN 2
CONTINUE *> TODO: フェーズ2は次回リリースで実装
WHEN 3
CONTINUE *> TODO: フェーズ3は要件定義中
WHEN OTHER
PERFORM INVALID-PHASE-ERROR
END-EVALUATE
EVALUATE TRUEとCONTINUEの組み合わせ
EVALUATE TRUEは複雑な条件分岐を整理するパターンです(詳細はEVALUATE文完全ガイド参照)。特定の条件を意図的に通過させたい場合にCONTINUEを使います。
WORKING-STORAGE SECTION.
01 WS-AMOUNT PIC 9(9)V99.
01 WS-CUST-RANK PIC X(1).
88 RANK-GOLD VALUE 'G'.
88 RANK-SILVER VALUE 'S'.
01 WS-ITEM-CODE PIC X(4).
88 FREE-ITEM VALUE 'FREE'.
* 割引適用ロジック: 一部の条件は割引なし(CONTINUE)
EVALUATE TRUE
WHEN FREE-ITEM
CONTINUE *> 無料品は割引計算不要(そのまま)
WHEN RANK-GOLD AND WS-AMOUNT >= 10000
COMPUTE WS-AMOUNT = WS-AMOUNT * 0.80 *> ゴールド20%引き
WHEN RANK-SILVER AND WS-AMOUNT >= 5000
COMPUTE WS-AMOUNT = WS-AMOUNT * 0.90 *> シルバー10%引き
WHEN WS-AMOUNT >= 50000
COMPUTE WS-AMOUNT = WS-AMOUNT * 0.95 *> 高額購入5%引き
WHEN OTHER
CONTINUE *> 上記以外は定価のまま
END-EVALUATE
IF文でのCONTINUE活用パターン
THEN CONTINUE で条件の否定を避ける
条件の否定(NOT)を使うより、肯定条件+CONTINUEで書いた方が読みやすくなる場合があります。特に88レベルを使うと意図がより明確になります。
*=== NOT条件を使った書き方(読みにくいケース) ===
IF WS-AMOUNT NOT > 0
DISPLAY '金額が0以下です'
ADD 1 TO WS-ERROR-CNT
END-IF
*=== THEN CONTINUEを使った書き方(肯定条件で読みやすい) ===
IF WS-AMOUNT > 0
CONTINUE *> 正常: 何もしない
ELSE
DISPLAY '金額が0以下です'
ADD 1 TO WS-ERROR-CNT
END-IF
*=== 88レベルと組み合わせるとさらに明確 ===
01 WS-AMOUNT PIC S9(9)V99 COMP-3.
88 AMT-VALID VALUE 1 THRU 999999999.99.
88 AMT-ZERO-OR-MINUS VALUE -999999999.99 THRU 0.
IF AMT-VALID
CONTINUE *> 正常金額: 処理続行
ELSE
DISPLAY '金額エラー: ' WS-AMOUNT
ADD 1 TO WS-ERROR-CNT
MOVE 8 TO RETURN-CODE
GOBACK
END-IF
二重否定を避けてCONTINUEで整理する
ネストしたIFでNOT条件が続くと非常に読みにくくなります。条件を整理してCONTINUEを使うことで、コードの意図がはっきりします。
*=== 読みにくい二重否定(NG例) ===
IF WS-DATA NOT = SPACES
IF WS-FLAG NOT = 'E'
PERFORM MAIN-PROCESS
END-IF
END-IF
*=== CONTINUEで整理した版(OK例) ===
EVALUATE TRUE
WHEN WS-DATA = SPACES
CONTINUE *> データなし: スキップ
WHEN WS-FLAG = 'E'
CONTINUE *> エラー済み: スキップ
WHEN OTHER
PERFORM MAIN-PROCESS
END-EVALUATE
*=== ガード節パターン(EXIT SECTIONと組み合わせ)===
PROCESS-SECTION SECTION.
IF WS-DATA = SPACES
EXIT SECTION *> データなし: セクション抜け
END-IF
IF WS-FLAG = 'E'
EXIT SECTION *> エラー済み: セクション抜け
END-IF
PERFORM MAIN-PROCESS.
PROCESS-END. EXIT.
PERFORM文でのCONTINUE活用
インラインPERFORMのループ本体をCONTINUEにする
ループの条件評価だけが目的で、ループ本体は何もしなくてよいケースがまれにあります(ポーリング待機など)。
*--- ポーリング: フラグが立つまで待つだけ(ループ本体は空)---
* ※実務ではCOBOLでビジーウェイトは避けるべき。例示目的
PERFORM UNTIL WS-READY-FLAG = 'Y'
CONTINUE *> フラグが立つのを待つだけ(外部から変更される想定)
END-PERFORM
*--- PERFORM TIMES でCONTINUE: 件数のカウントのみ ---
* ※これも実用性は低いが、文法上有効
PERFORM 5 TIMES
CONTINUE
END-PERFORM
*--- 実用的な例: SEARCH文でCONTINUEを使う ---
SEARCH WS-TABLE-ITEM
AT END
MOVE 'N' TO WS-FOUND-FLAG
WHEN WS-TABLE-KEY(WS-TABLE-IDX) = WS-SEARCH-KEY
CONTINUE *> 見つかった: インデックスはそのままでSEARCH終了
END-SEARCH
「何もしない」が設計上有効な場面
CONTINUEを使う場面を意識的に整理すると、コードの意図が設計レベルで明確になります。
| 場面 | 説明 | 例 |
|---|---|---|
| 許容エラーの明示的スキップ | ファイルSTATUSコードのうち「許容できるエラー」(例: 重複キーを無視)をCONTINUEで明示的にスキップする | WHEN ’22’ CONTINUE (重複キーは無視) |
| 将来実装のプレースホルダー | 設計段階でWHEN句を先に定義し、実装は後回しにするときのマーカー | WHEN 3 CONTINUE *> TODO |
| デフォルト動作の明示 | WHEN OTHERで「それ以外は何もしない」を省略せず書くことで意図が伝わる | WHEN OTHER CONTINUE |
| 条件の肯定表現への変換 | NOT条件より「正常はCONTINUE、異常だけELSE処理」と書くほうが読みやすい | IF 正常条件 CONTINUE ELSE エラー処理 END-IF |
| 空のテスト用スタブ | 単体テストやフェーズ開発でサブプログラム・段落をまず空実装する | PROCEDURE DIVISION. CONTINUE. GOBACK. |
実践パターン
ファイルSTATUSの許容エラーをCONTINUEで処理する
COBOLのファイル操作ではFILE STATUSコードが返ります。エラーコードの中には「許容できるもの」と「致命的なもの」があります。許容できるエラーをCONTINUEで明示的にスキップするパターンは実務で頻繁に使います。
WORKING-STORAGE SECTION.
01 WS-FILE-STATUS PIC X(2).
*> ファイルSTATUSコード(主要なもの)
*> '00': 正常
*> '02': 重複キー(ALTERNATE KEY)
*> '10': ファイル終端(EOF)
*> '22': 重複主キー(WRITE/REWRITE時)
*> '23': レコードなし(READ/DELETE時)
*> '35': ファイルが存在しない(OPEN時)
*> '48': WRITE中のエラー
PROCEDURE DIVISION.
*--- ファイルオープン後のステータスチェック ---
OPEN INPUT MASTER-FILE
EVALUATE WS-FILE-STATUS
WHEN '00'
CONTINUE *> 正常: 何もしない
WHEN '35'
*> ファイル未存在: 初回実行時は許容する
DISPLAY '警告: マスタファイルが存在しません'
DISPLAY ' 新規作成します'
PERFORM CREATE-NEW-MASTER
CONTINUE *> 以降の処理は続行
WHEN OTHER
DISPLAY 'ERROR: ファイルOPENエラー STATUS='
WS-FILE-STATUS
MOVE 8 TO RETURN-CODE
GOBACK
END-EVALUATE
*--- REWRITEでの重複キーチェック ---
REWRITE MASTER-REC FROM WS-UPDATE-REC
EVALUATE WS-FILE-STATUS
WHEN '00'
CONTINUE *> 正常: 更新成功
WHEN '22'
CONTINUE *> 重複ALT KEY: 許容(既知の仕様)
WHEN '23'
DISPLAY 'WARN: 対象レコード未存在 KEY=' WS-KEY
ADD 1 TO WS-SKIP-COUNT
CONTINUE *> スキップして次へ
WHEN OTHER
DISPLAY 'ERROR: REWRITE失敗 STATUS='
WS-FILE-STATUS
MOVE 8 TO RETURN-CODE
GOBACK
END-EVALUATE
レコードフィルタリング(対象外レコードをスキップ)
入力ファイルの中から処理対象のレコードだけを選択的に処理します。対象外レコードをCONTINUEで明示的にスキップする設計です。
WORKING-STORAGE SECTION.
01 WS-INPUT-REC.
05 WS-REC-TYPE PIC X(2).
88 REC-HEADER VALUE 'HD'.
88 REC-DETAIL VALUE 'DT'.
88 REC-TRAILER VALUE 'TR'.
05 WS-DELETE-FLAG PIC X(1).
88 IS-DELETED VALUE 'D'.
05 WS-DEPT-CODE PIC X(4).
05 WS-AMOUNT PIC S9(9)V99 COMP-3.
88 AMT-ZERO VALUE ZERO.
01 WS-TARGET-DEPT PIC X(4) VALUE 'A001'.
PROCEDURE DIVISION.
PERFORM PRIMING-READ
PERFORM UNTIL WS-EOF
PERFORM FILTER-AND-PROCESS
PERFORM READ-NEXT
END-PERFORM
STOP RUN.
FILTER-AND-PROCESS.
EVALUATE TRUE
WHEN REC-HEADER
CONTINUE *> ヘッダレコード: 処理不要
WHEN REC-TRAILER
CONTINUE *> トレーラレコード: 処理不要
WHEN IS-DELETED
ADD 1 TO WS-SKIP-CNT
CONTINUE *> 削除フラグあり: スキップ
WHEN AMT-ZERO
CONTINUE *> 金額ゼロ: 集計対象外
WHEN WS-DEPT-CODE NOT = WS-TARGET-DEPT
CONTINUE *> 対象部門以外: スキップ
WHEN OTHER
*> すべてのフィルタを通過した明細レコードを処理
PERFORM PROCESS-DETAIL-RECORD
END-EVALUATE.
状態マシンでの「遷移なし」をCONTINUEで表現する
バッチ処理の状態管理(ステートマシン)において、特定の状態+イベントの組み合わせで「状態は変わらない(何もしない)」ケースをCONTINUEで明示します。
* 注文処理の状態マシン
* 状態: INIT(初期)→ APPROVED(承認済)→ SHIPPED(出荷済)→ DONE(完了)
* イベント: APPROVE(承認)/ SHIP(出荷)/ COMPLETE(完了)/ CANCEL(取消)
WORKING-STORAGE SECTION.
01 WS-ORDER-STATUS PIC X(8).
88 STATUS-INIT VALUE 'INIT '.
88 STATUS-APPRVD VALUE 'APPROVED'.
88 STATUS-SHIPPED VALUE 'SHIPPED '.
88 STATUS-DONE VALUE 'DONE '.
88 STATUS-CANCEL VALUE 'CANCEL '.
01 WS-EVENT PIC X(8).
PROCEDURE DIVISION.
EVALUATE TRUE ALSO TRUE
WHEN STATUS-INIT ALSO WS-EVENT = 'APPROVE '
MOVE 'APPROVED' TO WS-ORDER-STATUS
PERFORM SEND-APPROVAL-MAIL
WHEN STATUS-APPRVD ALSO WS-EVENT = 'SHIP '
MOVE 'SHIPPED ' TO WS-ORDER-STATUS
PERFORM UPDATE-INVENTORY
WHEN STATUS-SHIPPED ALSO WS-EVENT = 'COMPLETE'
MOVE 'DONE ' TO WS-ORDER-STATUS
PERFORM CLOSE-ORDER
WHEN STATUS-DONE ALSO ANY
CONTINUE *> 完了済みはいかなるイベントも無視
WHEN STATUS-CANCEL ALSO ANY
CONTINUE *> キャンセル済みはいかなるイベントも無視
WHEN ANY ALSO WS-EVENT = 'CANCEL '
MOVE 'CANCEL ' TO WS-ORDER-STATUS
PERFORM CANCEL-PROCESS
WHEN OTHER
DISPLAY 'WARN: 無効な状態遷移 STATUS='
WS-ORDER-STATUS ' EVENT=' WS-EVENT
CONTINUE *> 不正遷移は警告のみで継続
END-EVALUATE
空スタブとしてのCONTINUE(テスト開発フロー)
トップダウン設計でメイン処理を先に実装し、サブプログラムや段落を後から実装するときにCONTINUEで空実装を作っておくパターンです。
*=== メイン処理(先に実装)===
PROCEDURE DIVISION.
MAIN-LOGIC.
PERFORM INIT-PROCESS
PERFORM LOAD-MASTER
PERFORM MAIN-BATCH
PERFORM OUTPUT-REPORT
PERFORM CLOSE-PROCESS
STOP RUN.
*=== フェーズ1: 実装済み ===
INIT-PROCESS.
OPEN INPUT TRANSACTION-FILE
OPEN OUTPUT RESULT-FILE.
*=== フェーズ2以降: CONTINUEで空スタブ ===
* TODO 2026-05: マスタファイルの読み込み実装
LOAD-MASTER.
CONTINUE.
* TODO 2026-05: メインバッチ処理実装
MAIN-BATCH.
CONTINUE.
* TODO 2026-06: 帳票出力実装(別チーム担当)
OUTPUT-REPORT.
CONTINUE.
CLOSE-PROCESS.
CLOSE TRANSACTION-FILE
CLOSE RESULT-FILE.
よくある落とし穴と対策
NEXT SENTENCEをCONTINUEと同じと思って使う
最も危険な誤りです。NEXT SENTENCEは「次のピリオドまでの処理をすべてスキップ」するため、IF・EVALUATEのブロック内で使うと想定外の処理省略が起きます。
対策: NEXT SENTENCEは使わずCONTINUEに統一します。旧コードをメンテナンスする際もNEXT SENTENCEを発見したらCONTINUEに置き換え、動作確認を行います。
WHEN OTHER を省略して「意図不明」なコードになる
WHEN OTHERを省略すると「他の条件は考慮していない」のか「考慮したが処理不要」なのかが読み手に伝わりません。チームメンバーが後で処理を追加する際、誤った場所に追記するリスクがあります。
対策: EVALUATE文では原則としてWHEN OTHERを書きます。処理が不要な場合もCONTINUEを置いて「意図的に何もしない」ことを明示します。
CONTINUEをプレースホルダーのまま本番に出す
「TODO」コメント付きのCONTINUEをプレースホルダーとして書いたまま本番デプロイしてしまうと、本来必要だった処理が実行されないバグになります。
対策: プレースホルダーのCONTINUEには必ず「TODO: 実装日・担当者・チケット番号」をコメントで付けます。本番デプロイ前にTODOコメントの検索を行うチェックを入れます。
IF 条件 CONTINUE の条件を逆に書く
IF 正常条件 CONTINUE ELSE エラー処理という書き方で、正常・異常の条件を逆に書いてしまうとすべて逆動作になります。CONTINUEが入ることで条件の見直しが疎かになりがちです。
対策: CONTINUEを使ったIF文は「CONTINUEが何もしない=正常ケース」であることをコメントで補足します。レビュー時に特に確認する箇所としてマークしておくと安全です。
PERFORM…UNTIL の本体がCONTINUEのビジーウェイトを作る
PERFORM UNTIL 条件 CONTINUE END-PERFORMでループ本体が何もしないと、条件が変化しない場合に無限ループ(CPU100%のビジーウェイト)になります。
ループ本体がCONTINUEだけの場合、UNTIL条件が外部から変化しないと無限ループになります。バッチ処理でCPUを専有し、ジョブ全体を詰まらせる原因になります。ポーリングが必要な場合はSYSTEM SLEEPや適切な待機機構を使い、CONTINUEのみのループは避けます。
よくある質問
IF 条件 THEN 処理 ELSE CONTINUE END-IFと書けます。ただしELSEブランチのCONTINUEは「ELSEが省略された場合と動作が同じ」ため、ELSE CONTINUEを書く実用的な理由はほとんどありません。CONTINUEはTHENブランチ(IF 正常条件 THEN CONTINUE ELSE エラー処理)で使うパターンの方が有用です。まとめ
CONTINUE文の使いどころと設計上の意味を整理します。
| パターン | ポイント |
|---|---|
| WHEN OTHER CONTINUE | EVALUATE文の他の条件を意図的に無視する設計意図を明示する |
| 特定のWHEN + CONTINUE | 選択的スキップ。「この条件は意図的に処理しない」を宣言する |
| IF 正常条件 CONTINUE ELSE 処理 | 否定条件を避けて可読性を上げる。肯定条件で正常系を表現 |
| プレースホルダー CONTINUE | まだ実装されていない処理の仮実装。TODOコメントとセットで |
| 空スタブ段落 | トップダウン開発でサブプログラムをまず空実装する |
| NEXT SENTENCEとの違い | CONTINUE=次の文へ / NEXT SENTENCE=次のピリオドまでスキップ(危険・非推奨) |
CONTINUE文は「何もしない」だけの単純な命令ですが、意図を明示する道具として使うことでコードの可読性と保守性が大きく向上します。EVALUATE文の全構文(THRU・ALSO・EVALUATE TRUE)についてはEVALUATE文完全ガイドを、IF文の条件表現についてはIF文完全ガイドもあわせてご覧ください。
