こんにちは。「Javaを復習する初心者」です。
前回はbreak文を扱いました。ループの中で使うものとしてもう一つcontinue文があります。continue文を書いた箇所では、以降の処理を実行せず最も内側のループの次の繰り返しに処理が移ります。for (int i; …; i++)の場合、i+1が実行されてのfor文の中身の先頭に処理が移るということです。continue文以下を無視する雰囲気です。
ソースと実行結果
以下にフローを書きます。思い浮かんだ具体例は、出欠確認で出席者にはHelloを言い、欠席者には何も言わないという状況です。管理番号の配列と出欠の配列が与えられた場合を想定してプログラムしてみました。
変数
出欠を表す列挙型変数を以下のように定義します。
修飾子 | 変数の型 | 変数名 | 内容 |
---|---|---|---|
private | enum | Attendance | YES, NO |
フロー
- 管理番号を格納するint型配列numsを定義し、以下のように初期化する。
要素番号 値 0 10 1 11 2 12 3 13 4 14 出欠を格納するAttendance型配列attendanceを定義し、以下のように予期化する。
要素番号 値 0 YES 1 YES 2 NO 3 YES 4 YES - 繰り返しカウンタiが0からnums.length未満まで以下の処理を実行する。
- “No.” + nums[i]をprintで出力する。
- attendances[i]がNOの場合
- printlnで改行する。
- continueで次の繰り返しに移る。
- ” Hello.”をprintlnで出力する。
以下はソースと実行結果です。
ソースコード
package test;
public class HelloContinue {
private static enum Attendance {
YES, NO
}
public static void main(String[] args) {
int[] nums = {
10, 11, 12,
13, 14 };
Attendance[] attendances = {
Attendance.YES, Attendance.YES, Attendance.NO,
Attendance.YES, Attendance.YES };
for (int i = 0; i < nums.length; i++) {
System.out.print("No." + nums[i]);
if (attendances[i] == Attendance.NO) {
System.out.println();
continue;
}
System.out.println(" Hello.");
}
}
}
結果
No.10 Hello.
No.11 Hello.
No.12
No.13 Hello.
No.14 Hello.
解説
System.out.printは改行なしでコンソールに出力するメソッドです。引数が必須です。一方、System.out.printlnは引数なしが用意されていて、改行のみ出力という処理になります。改行文字はシステムに応じたコードを出力するようです。
12番は欠席なのでHelloなしです。continue文が実行されて次の繰り返し処理に移ったということです。continue文の代わりにif-else文を使うことが可能な場合が多いと思うのですが、どちらが良いのかよくわかりません。特殊な場合を処理なしでスキップしたい場合、continueを書くと分かりやすいと思いますが、今回のサンプルは列挙型の値に応じた処理を記述するため、switch文が一番良いと改めて思いました。
前回は2重ループをlabelとbreak文を使って抜けるプログラムを書きましたが、continue文でもlabelが使えます。