読者です 読者をやめる 読者になる 読者になる

【Java】繰り返し制御文であるbreakとcontinueの違いとラベルの使い方

スポンサーリンク

for文やwhile文の繰り返しを強制的に抜けるための繰り返し制御文についてです。 breakとcontinueで意味が違いますがよくどっちを使うか忘れてしまいます。

break文

break文は実行中の繰り返し処理を中断して抜けるときに使用します。わざと無限ループを作ってそこから抜け出す場合とかにも使用されます。例えば以下のような繰り返し処理があったとします。

int[] nums = {1, 3, 8, 15, 23, 51};
boolean flg = false;
for (int i=0; i<nums.length; i++) {
  if (nums[i] == 15) {
    flg = true;
    break;
  }
}
System.out.println("終了");

この場合は配列の中から15の数字が見つかった時点でbreakされてfor文を抜けます。そうすると次の実行文であるSystem.out.printlnに制御が移るといった具合です。breakはswitch文のcaseでも使用しますが、どちらも処理を終了するという意味では同じですね。

continue文

continue文は実行中の繰り返し処理を中断するのではなく、continue以降の処理を飛ばして条件式に制御が移り、条件判定後、引き続き次の繰り返し処理を実行します。

int[] nums = {1, 3, 8, 15, 23, 51};
for (int i=0; i<nums.length; i++) {
  if (nums[i] == 15) {
    continue;
  }
  System.out.println(nums[i]);
}
System.out.println("終了");

break文との違いは配列の数字が15の時にfor文を抜けるのではなく、以降の処理を飛ばして次の配列の数字23に制御が移るという点です。また、continue文は繰り返し文内でのみ有効なので、その他(switchやif)なんかに記述するとコンパイルエラーになります。

ラベル

繰り返し文がネストしている場合などに、内側の繰り返し文から外側の繰り返し文まで一気に抜けたい場合などに使えます。基本的な構文は以下の形です。

ラベル名:
制御文 {
  break ラベル名;
  continue ラベル名;
}

ラベルを使用した例を簡単に書くとこうなります。

loop1:
for (int i=0; i<nums.length; i++) {
  for (int j=0; j<counts.length; j++) {
    if (counts[j] == 10) {
      break loop1;
    }
  }
}

loop2:
for (int i=0; i<nums.length; i++) {
  for (int j=0; j<counts.length; j++) {
    if (counts[j] == 10) {
      continue loop2;
    }
  }
}

breakの場合は外側のfor文まで一気に抜けて次の実行文に制御が移りますが、continueの場合は内側のfor文を抜けた後、外側のfor文の条件式に制御が移り、条件判定後、引き続き次の繰り返し処理が実行されます。

個人的にはラベルを使うと分かりづらくなるので、どうしようもないときを除いて実装方法を変えた方がいいんじゃないかと思います。