Javaのcontinue文を完全解説!15選の使い方と応用例

Javaのcontinue文を解説するイラストとテキストJava
この記事は約25分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、Javaのcontinue文を使いこなすことができるようになります。

プログラミングでよく出会う繰り返し処理、その中でも特に「ループ」において、特定の条件に合致したときにスキップしたい――そんな要望はよくありますよね。

Javaでは、このような処理を綺麗にかつ効率的に書くために「continue文」が提供されています。

Javaにおけるcontinue文の基本的な使い方から応用例、そしてそのカスタマイズ方法まで、初心者から中級者までが理解できるように詳しく解説します。

●Javaとは

○Javaの基本概念

Javaは、1995年にサン・マイクロシステムズ(現在はオラクル社)によって開発されたプログラミング言語です。

オブジェクト指向を採用しており、一度書いたコードがさまざまなプラットフォームで動作する「Write Once, Run Anywhere」が大きな特徴です。

○Javaでよく使われる制御文

Javaでは、ループ(繰り返し処理)や条件分岐などの制御文が多く用意されています。

主なものとしては、if文、for文、while文、do-while文、switch文などがあります。

これらの制御文は、単独で使われることもありますが、組み合わせて使われることでさまざまな複雑な処理を実現します。

そして、特定の状況でループ処理をコントロールするために「continue文」や「break文」もよく用いられます。

特に今回注目するcontinue文は、特定の条件下でその後の処理をスキップし、次のループに移る役割を果たします。

●continue文の基本

Javaプログラムの中でループを使って処理を繰り返すとき、特定の条件でループ内の処理をスキップしたい場面がよく出てきます。

その際に利用されるのが「continue文」です。

○continue文とは

continue文は、ループ処理の中で使用される制御文の一つです。

この文を実行すると、ループの残りの部分をスキップして、次のループ処理に移ります。

簡単に言うと、「この回のループはここまでとして、次に進もう!」という指示を出す役割があります。

○基本的な使い方

continue文の基本的な使い方を、for文と組み合わせたサンプルコードを通して説明します。

public class ContinueExample {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            if (i % 2 == 0) {
                continue;  // iが偶数の場合、以下の処理をスキップ
            }
            System.out.println(i);
        }
    }
}

このコードでは0から9までの数字をfor文で繰り返して出力しています。

しかし、iが偶数のときにはcontinue文が実行されるため、その後のSystem.out.println(i);は実行されず、次のループに移ります。

このコードを実行すると、次のような出力が得られます。

1
3
5
7
9

このように、偶数(0, 2, 4, 6, 8)が出力されず、奇数のみが出力されているのがわかります。

continue文は、このようにループ内の特定の処理をスキップするときに非常に便利です。

ただし、乱用するとコードの可読性が下がる場合があるため、使用する際には注意が必要です。

●continue文の詳細な使い方

Javaのcontinue文は非常に便利ですが、その効果を最大限に発揮するためには、その詳細な使い方を理解することが重要です。

ここでは、continue文がどのように各種のループで使用されるのか、サンプルコードを用いて詳しく説明します。

○サンプルコード1:forループでの使用例

まず初めに、forループと一緒にcontinue文を使った基本的な例を見てみましょう。

public class ForLoopContinue {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            if (i == 2) {
                continue; // iが2の時、以下の処理をスキップ
            }
            System.out.println("iの値は " + i);
        }
    }
}

このサンプルコードでは、0から4までの数字に対してループ処理を行います。

ループ内でiの値が2の場合は、continue文が実行され、その後のSystem.out.println("iの値は " + i);は実行されません。

実行すると、出力結果は次のようになります。

iの値は 0
iの値は 1
iの値は 3
iの値は 4

“iの値は 2″という出力がスキップされていることが確認できます。

○サンプルコード2:whileループでの使用例

次に、whileループにおけるcontinue文の使用例を考察します。

public class WhileLoopContinue {
    public static void main(String[] args) {
        int i = 0;
        while (i < 5) {
            if (i == 2) {
                i++; // iをインクリメントしてからスキップ
                continue; // iが2の時、以下の処理をスキップ
            }
            System.out.println("iの値は " + i);
            i++;
        }
    }
}

このコードでは、iが2の時にcontinue文が実行される構造になっています。

ただし、whileループを使う場合は、iをインクリメントする操作をcontinue文の前に移動しています。

この点がforループとは異なります。実行結果は次の通りです。

iの値は 0
iの値は 1
iの値は 3
iの値は 4

こちらも”iの値は 2″という出力がスキップされています。

○サンプルコード3:do-whileループでの使用例

do-whileループもJavaプログラミングでよく使用されるループの一つです。

このループタイプでは、まずブロック内の処理が実行され、その後に条件が評価されます。

この特性を考慮しながら、do-whileループ内でcontinue文を適用してみましょう。

public class DoWhileLoopContinue {
    public static void main(String[] args) {
        int i = 0;
        do {
            if (i == 2) {
                i++; // iをインクリメントしてからスキップ
                continue; // iが2の場合、以降の処理をスキップ
            }
            System.out.println("iの値は " + i);
            i++;
        } while (i < 5);
    }
}

このコードでは、do-whileループが5回実行される予定です。

しかし、iが2になった際にcontinue文が実行されるため、その回のSystem.out.println("iの値は " + i);はスキップされます。

ここで注意すべき点は、whileループと同様に、iをインクリメントする処理をcontinue文の前に置く必要があることです。

実行すると次の出力が得られます。

iの値は 0
iの値は 1
iの値は 3
iの値は 4

“iの値は 2″が出力されないことから、continue文が正確に働いていることがわかります。

○サンプルコード4:ネストしたループでの使用例

複数のループを組み合わせて使用する場合、通称「ネストしたループ」と呼ばれる状況が発生します。

この場合でもcontinue文はその役割を果たしますが、どのループに対して作用するのか明確に理解する必要があります。

public class NestedLoopContinue {
    public static void main(String[] args) {
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 3; j++) {
                if (j == 2) {
                    continue; // 内側のループに対して処理をスキップ
                }
                System.out.println("i = " + i + ", j = " + j);
            }
        }
    }
}

このコードでは外側のループ(iに関するループ)と内側のループ(jに関するループ)があります。

内側のループでjが2になると、continue文によってその後の処理がスキップされます。

この場合の出力は次の通りです。

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

“i = 1, j = 2″、”i = 2, j = 2″、”i = 3, j = 2″といった行が出力されていないことから、continue文が内側のループに正確に作用していることが確認できます。

●continue文の応用例

この節では、continue文を更に進んだ形で使用するいくつかの例を見ていきましょう。

これまで基本的な使用方法について説明してきましたが、実際のプログラミング作業ではより複雑なケースが多くあります。

それを考慮して、より実践的な例を紹介します。

○サンプルコード5:条件に応じて処理をスキップ

最初に、複数の条件が組み合わさった状況でcontinue文を使う例を見ていきましょう。

例えば、ある数列から特定の条件に一致する数値だけをスキップしたい場合が考えられます。

public class ConditionalSkip {
    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            if (i % 2 == 0 || i % 3 == 0) {
                continue; // 2または3で割り切れる数をスキップ
            }
            System.out.println("条件に一致しない数: " + i);
        }
    }
}

このコードは0から10までの数値をループで処理しています。

iが2または3で割り切れる場合には、continue文が実行されてそれ以降の処理がスキップされます。

結果として出力される数値は、2でも3でも割り切れない数値のみになります。

このコードを実行すると、次のような出力が得られます。

条件に一致しない数: 1
条件に一致しない数: 5
条件に一致しない数: 7
条件に一致しない数: 9

○サンプルコード6:配列から特定の要素を除外

次に、配列内の要素をループで処理する際に、特定の要素だけをスキップするケースを考えてみましょう。

public class ArrayElementSkip {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        for (int num : array) {
            if (num == 3) {
                continue; // 配列の要素が3の場合に処理をスキップ
            }
            System.out.println("配列の要素: " + num);
        }
    }
}

このコードは、1から5までの要素を持つ配列を処理しています。

要素が3の場合にcontinue文が実行され、その後の処理がスキップされます。

このコードを実行すると、次のような出力が得られます。

配列の要素: 1
配列の要素: 2
配列の要素: 4
配列の要素: 5

この例では、要素が3の場合にcontinue文により処理がスキップされているため、その数値が出力から除外されています。

○サンプルコード7:複数の条件でスキップ

プログラミングにおいては、一つ以上の条件に合致する場合に処理をスキップしたいというシチュエーションもよくあります。

下記のサンプルコードでは、そのような場合にどのようにcontinue文を使えるかを表します。

public class MultiConditionSkip {
    public static void main(String[] args) {
        for (int i = 1; i <= 20; i++) {
            // iが偶数または5で割り切れる場合、処理をスキップ
            if (i % 2 == 0 || i % 5 == 0) {
                continue;
            }
            System.out.println("条件に一致しない数:" + i);
        }
    }
}

このサンプルコードでは、1から20までの数値について、各数値が偶数(2で割り切れる)または5で割り切れる場合に処理をスキップしています。

if文内での論理演算子||(OR演算子)を使って複数の条件を組み合わせています。

このプログラムを実行すると、次のような出力が得られます。

条件に一致しない数:1
条件に一致しない数:3
条件に一致しない数:7
条件に一致しない数:9
条件に一致しない数:11
条件に一致しない数:13
条件に一致しない数:17
条件に一致しない数:19

この結果からも分かるように、数値が偶数または5で割り切れる場合には出力されていません。

○サンプルコード8:continue文とbreak文の併用

continue文だけでなく、break文もループ制御でよく用いられます。

この2つをうまく組み合わせることで、更に高度な制御が可能になります。

public class ContinueAndBreak {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i == 5) {
                break; // iが5になった場合、ループを終了
            }
            if (i % 2 == 0) {
                continue; // iが偶数の場合、処理をスキップ
            }
            System.out.println("処理中の数:" + i);
        }
    }
}

このコードは、1から10までの数値を順番に処理しています。

iが偶数であればcontinue文によって処理がスキップされ、iが5になったらbreak文によってループが終了します。

実行すると次のような出力が得られます。

処理中の数:1
処理中の数:3

この場合、iが偶数である場合はcontinue文によってスキップされ、さらにiが5に達したときには、break文が実行されてループ自体が終了しています。

●continue文のより高度な応用例

Javaのcontinue文は基本的なループ制御から高度な応用まで、多くの場面で役立つ制御文です。

ここでは、より専門的なケースに対応できるような、高度な使い方をいくつか紹介します。

○サンプルコード9:ラベルを使用した例

Javaでは、ラベルとcontinue文を組み合わせて、多重ループでも特定のループに対してcontinue文を適用することができます。

public class LabeledContinue {
    public static void main(String[] args) {
        outer: // このラベルが外側のループに付けられています
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 3; j++) {
                if (j == 2) {
                    continue outer; // 外側のループに対してcontinue文を適用
                }
                System.out.println("i: " + i + ", j: " + j);
            }
        }
    }
}

このコードでは、外側のループにouterというラベルを付け、内側のループでcontinue文を用いる際にこのラベルを指定しています。

これにより、j == 2になった時点で外側のループに対してcontinueが適用されます。

実行してみると、出力は次のようになります。

i: 1, j: 1
i: 2, j: 1
i: 3, j: 1

jが2になった瞬間に、外側のループが次のイテレーションに移っていることがわかります。

○サンプルコード10:continue文でリファクタリング

コードの可読性やメンテナンス性を高めるために、continue文はリファクタリングにも役立ちます。

例えば、次のようにネストが深いif文を見てみましょう。

public class WithoutContinue {
    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            if (i % 2 == 0) {
                if (i != 4 && i != 8) {
                    System.out.println("偶数ですが4または8ではない数:" + i);
                }
            }
        }
    }
}

このコードでは偶数かつ4でも8でもない数を出力していますが、ネストが深くて少し読みにくいです。

ここでcontinue文を使ってリファクタリングすると次のようになります。

public class WithContinue {
    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            if (i % 2 != 0) continue;
            if (i == 4 || i == 8) continue;
            System.out.println("偶数ですが4または8ではない数:" + i);
        }
    }
}

continue文を使うことで、コードがスッキリとして可読性が高まります。

このケースでの実行結果は、どちらのコードも以下のような出力をします。

偶数ですが4または8ではない数:0
偶数ですが4または8ではない数:2
偶数ですが4または8ではない数:6
偶数ですが4または8ではない数:10

○サンプルコード11:ストリーム処理での使用例

Java8以降、ストリームAPIを使うことで、データの変換や処理をより効率的に行うことができます。

continue文自体はストリーム処理で直接使用することはありませんが、ストリームAPIで条件によって処理をスキップするような動きを模倣することはできます。

ここでは、ストリーム処理で条件に基づいて要素をスキップする方法について解説します。

import java.util.stream.Collectors;
import java.util.List;
import java.util.Arrays;

public class StreamContinueExample {
    public static void main(String[] args) {
        // 元のリスト
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // ストリームでフィルタリング
        List<Integer> filteredNumbers = numbers.stream()
            .filter(n -> n % 2 != 0)  // 奇数だけを取得
            .filter(n -> n < 8)       // 8より小さい数だけを取得
            .collect(Collectors.toList());

        // 出力
        System.out.println(filteredNumbers);
    }
}

このコードでは、filterメソッドを用いて、特定の条件にマッチする要素だけを新しいリストにしています。

特に、偶数と8以上の数はこのリストから除外されています。

こうした動きは、ループとcontinue文を使っても実現できますが、ストリームAPIを用いると、このように簡潔に記述できる利点があります。

このプログラムを実行すると、次の出力が得られます。

[1, 3, 5, 7]

この出力から、偶数や8以上の数がうまく除外され、条件に一致する奇数だけが新しいリストに含まれていることが確認できます。

○サンプルコード12:エラーハンドリングとの組み合わせ

continue文はエラーハンドリングと組み合わせて使うことができます。

エラーが発生した場合にそのイテレーションをスキップするサンプルコードを紹介します。

public class ErrorHandlingContinue {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            try {
                if (i == 2) {
                    throw new Exception("エラー発生");
                }
                System.out.println("処理を実行: " + i);
            } catch (Exception e) {
                System.out.println("エラーを検出、次のループへ");
                continue;
            }
        }
    }
}

このサンプルでは、iが2のときに例外を投げています。

catchブロックで例外を捕まえて、その後でcontinue文を用いて次のループへと移行しています。

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

処理を実行: 0
処理を実行: 1
エラーを検出、次のループへ
処理を実行: 3
処理を実行: 4

ここで、i == 2のときはエラーが発生しているため、「処理を実行: 2」という出力はスキップされ、次のループに移っています。

●注意点と対処法

continue文は繰り返し処理の流れを制御する強力なツールですが、適切に使用しないと、コードの可読性やパフォーマンスに影響を与える可能性があります。

ここでは、そのような注意点とそれに対する対処法を解説します。

○continue文の誤用

初心者が犯しやすいミスの一つは、continue文を過度に使用することです。

この誤用はコードの可読性を低下させる可能性があります。

たとえば、次のようなコードが考えられます。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;
    }
    if (i == 3) {
        continue;
    }
    // その他の処理
    System.out.println(i);
}

上記のコードでは、偶数または3であればそのイテレーションをスキップします。

このような場合、continue文を複数使うよりも、条件を一つにまとめることで、より読みやすいコードになります。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0 || i == 3) {
        continue;
    }
    // その他の処理
    System.out.println(i);
}

この修正後のコードを実行すると、出力は「1, 5, 7, 9」となり、偶数および3が除外された結果が得られます。

○パフォーマンスへの影響

continue文自体はコンパイラが最適化を行うため、パフォーマンスへの影響はほとんどありません。

しかし、不必要な条件分岐が多くなると、それが累積してパフォーマンスに影響を与える可能性があります。

例えば、以下のようなネストされたループでは、continue文が内部ループで使われている場合、外部ループが多くのイテレーションを行うとパフォーマンスが低下する可能性があります。

// 外部ループ
for (int i = 0; i < 1000; i++) {
    // 内部ループ
    for (int j = 0; j < 1000; j++) {
        if (j % 100 == 0) {
            continue;
        }
        // その他の処理
    }
}

○可読性とメンテナンス

過度な使用や誤用が続くと、continue文はコードの可読性を低下させ、メンテナンスが困難になる可能性があります。

そのため、コメントを活用して、何のためにcontinue文を使っているのかを明示することが重要です。

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;  // 偶数はスキップ
    }
    // その他の処理
    System.out.println(i);
}

このサンプルコードを実行すると、出力は「1, 3, 5, 7, 9」になります。

●カスタマイズ方法

Javaのcontinue文はその基本機能だけでなく、さまざまな応用が可能です。

ここでは、カスタムライブラリでの使用や拡張forループ、ラムダ式との組み合わせなど、高度なカスタマイズ方法を紹介します。

○サンプルコード13:カスタムライブラリでの使用

Javaには多くのライブラリが存在しますが、独自のライブラリを作成して、そこでcontinue文を使用することもあります。

例として、整数のリストから特定の値をフィルタリングするライブラリを考えましょう。

import java.util.ArrayList;
import java.util.List;

public class CustomFilter {
    public static List<Integer> filterOut(List<Integer> numbers, int target) {
        List<Integer> result = new ArrayList<>();
        for (int number : numbers) {
            if (number == target) {
                continue;
            }
            result.add(number);
        }
        return result;
    }
}

このコードでは、CustomFilterクラス内でfilterOutメソッドを定義しています。

このメソッドは、整数のリストとフィルタリング対象となる整数を受け取り、その整数を除いた新しいリストを生成して返します。

continue文がこのフィルタリングを効率的に行っています。

このコードを使用すると、次のような結果が得られます。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 3);
List<Integer> filtered = CustomFilter.filterOut(numbers, 3);
System.out.println(filtered);  // 出力:[1, 2, 4, 5]

○サンプルコード14:拡張forループとの組み合わせ

拡張forループ(foreachループ)とcontinue文を組み合わせることで、コードを更に簡潔にすることができます。

int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    if (number % 2 == 0) {
        continue;  // 偶数はスキップ
    }
    System.out.println(number);
}

このコードでは、配列numbersから要素を一つずつ取り出し、その要素が偶数であればスキップします。出力は「1, 3, 5」となり、偶数が正確に除外されています。

○サンプルコード15:ラムダ式との組み合わせ

Java 8以降、ラムダ式とStream APIを用いて、高度なデータ操作が可能になりました。

continue文とは直接関係ありませんが、同様の処理をStreamで実装する方法もあります。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> filtered = numbers.stream()
                                .filter(n -> n % 2 != 0)
                                .collect(Collectors.toList());
System.out.println(filtered);  // 出力:[1, 3, 5]

このコードでは、ラムダ式とStream APIを使用して、リスト内の偶数をフィルタリングしています。

出力は「1, 3, 5」となり、偶数が除外された新しいリストが生成されます。

まとめ

本記事では、Javaのcontinue文の多角的な側面について詳細に探究してきました。

初心者が知るべき基本的な使い方から、中級者や上級者が取り組むような応用例、そしてそれに続く注意点と対処法、さらにはカスタマイズ方法までを網羅しました。

その効果を最大限に活用するには、その基本性質を理解するだけでなく、さまざまな応用可能な局面を知ることが重要です。

この記事が、continue文というJavaの基本的な制御文に新たな視点をもたらし、より高度なプログラミングへの道を拓く一助となれば幸いです。