第7回では繰り返し処理(for文、foreach文)についての学習をしました。今回は繰り返し処理(while文、do..while文)とラベルについて解説していきます。

while文

前回解説したfor文は、指定した回数(もしくは配列/コレクション内の要素すべて)を繰り返したい場合に使用しますが、while文は条件がtrue(真)の間に何度でも処理を繰り返したいときに使用します。

  • while文の書式

while (条件式) {
  実行する処理1;
  実行する処理2;
  ……
}

while文では、まずはじめに式の値を評価します。式は結果がboolean型(真/偽)の値を返すものでなければいけません。式の値がtrue(真)だった場合、{ から } のブロック内に記述してある処理を実行します。条件式はfor文と同じく、関係演算子や論理演算子を使用します。ブロック内の処理が終わると、再び条件式の値を評価します。式の結果がtrue(真)である場合には再度ブロック内の処理を実行します。条件式の値がtrue(真)であるかぎり、ブロック内の処理は何度も実行されるので注意してください。また、条件式が最初からfalse(偽)の場合には、一度もブロック内の処理は実行されません。なお、ブロック内で実行する文がひとつだった場合、次のような省略記法が可能です。

  • while文でブロック内の処理がひとつだった場合の書式

while (条件式)
  実行する処理;

while文はfor文とまったく同じように使用することが可能ですが、for文のように初期化のための式や変化式がありません。このため、条件式内で変数を使う場合、while文の前に変数を定義しておく必要があります。また、条件式の結果を変更するには、自分で記述しなければいけません。この条件式に不備があった場合、while文がいつまでも終わらない状態(無限ループ)になってしまうので、繰り返し処理の終了条件はしっかり確認をしておきましょう。

while文は繰り返す回数が決まっていない場合(たとえば、ファイルからのデータ読み込みなど)に使用することが多いですが、for文の代わりに使用してもまったく問題ありません。「繰り返し回数が決まっているならfor文」、「繰り返し回数が決まっていないならwhile文」というのは、あくまでも基本的な指針です。処理の内容やプログラム全体の構成から判断して使い分けてください。

では次に、while文のサンプルプログラムを記述して動作を確認してみましょう。

  • while文の例

int count = 0;

while (count < 2) { // countが2より小さい場合
  System.out.println("count = " + count);
  count++; // countに1を足す
}

上記の例では、まず変数(count)を定義して、0を代入しています。次に、条件式を評価します。ここではcountは2よりも小さいので結果はtrue(真)となり、ブロック内の処理が実行され「count = 0」を画面に出力します。そして、countをインクリメントしたあと、再度条件式を評価します。まだcountは2よりも小さいので、結果はtrue(真)となり、「count = 1」が画面に出力されます。もう一度countをインクリメントしたあと、条件式を評価します。countは2よりも小さくないため、繰り返し処理が終了します。

do..while文

while文では条件式を評価してから最初の繰り返し処理を行いますが、最初に繰り返し部分の処理を行ってから条件式を評価したい場合に利用されるのがdo..while文です。

  • do..while文の書式

do {
  実行する処理1;
  実行する処理2;
  ……
} while (条件式);

まず最初に、{ から } ブロック内の処理を実行します。その後、条件式を評価して結果がtrue(真)だった場合、再びブロック内の処理を実行し、条件式の結果がfalse(偽)になるまでそれを繰り返します。なお、条件式が最初からfalse(偽)だった場合でも、最低一度はブロック内の処理が実行されます。

do..while文の書式を見てもらうとわかりますが、「while(条件式)」の最後に;(セミコロン)がついています。このセミコロンは忘れやすいので気をつけましょう。なお、ブロック内で実行する文がひとつだった場合、次のような省略記法が可能です。

  • do..while文でブロック内の処理がひとつだった場合の書式

do
  実行する文;
while (条件式);

この記述方法については、少しわかりづらくなる可能性があるので注意してください。

では、do..while文のプログラムを記述して動作を確認してみましょう。

  • do..while文の例

int count = 0;

do {
  System.out.println("count = " + count);
  count++; // countに1を足す
} while (count < 2); // countが2より小さい場合

上記の例では、変数(count)を定義し、0を代入したあと「count = 0」を画面に出力します。次にcountをインクリメントし、条件式を評価します。countは2よりも小さいので結果はtrue(真)となり、ブロック内の処理が実行され、「count = 1」を画面に出力したあと、countをインクリメントします。そして条件式が評価されますが、countは2よりも小さくないため、繰り返し処理が終了します。

do..while文の内容は、for文やwhile文でも同じように記述することができます。しかし、do..while文を使った方がシンプルに記述できる場合があるので、場合によって使い分けてください。

ラベル

以前、break文を使用すると一番内側の繰り返し処理から抜けると解説しました。ここでは少し違ったbreak文の使い方について解説します。次の例を見てください。

  • break文の例

int count = 0;
while (count < 100) {

   System.out.println("count = " + count);
   if (count == 50) {
    break;
  }
  count++;
}

上記の例では、countが100になるまで繰り返しを続けますが、countが50になった時点でif文の中のbreak文が実行され、 その時点でwhile文(一番内側の繰り返し)を終了しています。

この場合、繰り返しがひとつだけなので問題ありませんが、繰り返しが何重にもなっていてそこからbreak文で、一気に繰り返し処理の外へ移動したい場合もあります。そういったときに便利なのが、「breakラベル」です。

  • breakラベルの書式

ラベル名 : {
  実行する処理1;
  実行する処理2;
  ……
  break ラベル名;
}

繰り返し処理(for/foreach/while/do..while)の前にラベル名をつけてブロックを記述し、任意の位置で「break ラベル名;」とすることで、対象のラベルがついたブロックから抜け出すことができます。

  • breakラベルの例1

outside: {
  for (int i = 0; i < 3; i++) {
    
    inside: {
      for (int j = 0; j < 3; j++) {
        System.out.println("i =" + i + ", j = " + j);
        if (i == 1 && j == 1) {
          System.out.println("--break inside--");
          break inside;
        }
      }
    }
    
  }
}

ここでは二重のfor文が記述されており、外側の繰り返し処理にはoutsideラベル、内側の繰り返し処理にはinsideラベルがつけられています。そして、繰り返し処理の中で変数iと変数jが1になった場合にinsideラベルのついたブロックからfor文の外へ移動しています。上記例を実行すると、次のような実行結果が表示されます。

  • 例1の実行結果

i =0, j = 0
i =0, j = 1
i =0, j = 2
i =1, j = 0
i =1, j = 1
--break inside--
i =2, j = 0
i =2, j = 1
i =2, j = 2

ここでのbreakはinsideブロックから抜けるだけなので、外側の繰り返し処理の続きが実行されています。

では次に、同じ条件で今度はoutsideラベルのついたブロックからbreakしてみましょう。

  • breakラベルの例2

outside: {
  for (int i = 0; i < 3; i++) {
    
    inside: {
      for (int j = 0; j < 3; j++) {
        System.out.println("i =" + i + ", j = " + j);
        if (i == 1 && j == 1) {
          System.out.println("--break outside--");
          break outside;
        }
      }
    }
    
  }
}

上記例を実行すると、次のような実行結果が表示されます。

  • 例2の実行結果

i =0, j = 0
i =0, j = 1
i =0, j = 2
i =1, j = 0
i =1, j = 1
--break outside--

今度は同じ条件で「break outside;」実行後、一気に外側の繰り返し処理からも抜けています。このように、多重にネストした繰り返し処理から抜けたい場合には、breakラベルを使用することで簡潔に記述することができます。


今回は繰り返し処理(while文、do..while文)とラベルについて解説しました。次回もJavaの基本構文について解説していく予定です。

執筆者紹介

八重桜雅子(YAEZAKURA Masako)

以前はシステム開発会社で約8年間働いていました。JavaやJavaScriptなどのWeb系の技術をよく使用していました。