繰り返し処理を操作する(『break』と『continue』の使い方)

繰り返し処理を操作する(『break』と『continue』の使い方) 【ゼロから始めるJavaの基礎~その25~】

前回まではプログラムに反復構造を実装するための『for文』と『while文』という構文についてご紹介をしてきました。
ご紹介した構文をそのまま使用した場合、繰り返しは最初から最後へと1つずつ順番に実行されていきます。

さらに柔軟に繰り返しの構造を作りたい場合には、繰り返しの処理の中で『break』や『continue』といった命令を使用します。
これらを使用することで、ある条件に当てはまった場合に繰り返し処理を中断したり、繰り返し1回分だけをスキップしたりといった操作を実装することが出来ます。

繰り返しの処理を中断する『break』

ある条件に当てはまった場合に、繰り返しの処理を中断したい場合には『break』という命令を使います。

【サンプル】

for(int i = 0; i < 10; i++) {
	int num = (int)(Math.random() * 10);
	System.out.println((i + 1) + "回目の繰り返しです。生成された数値は『" +  num + "』です");
	
	if(num % 2 == 0) {
		System.out.println("偶数が生成されたので処理を中断します");
		break;
	}
}

【実行結果】(※実行のたびに結果が変わります)

今回のサンプルでは1行目で1~10のランダムな整数を生成しています。
現段階では知らない書き方だと思いますが、今は1行目の右辺のような書き方をすることで1~10のランダムな整数を生成できると思ってください。
それを『num』という変数に代入しています。

5行目から条件分岐に突入します。
ここでは『num』が2で割り切れるか、つまりランダムに生成された数値が偶数かどうかを判定しています。
奇数の場合はそのままif文を抜けますが、偶数だった場合は文字列を出力したのちに、7行目の『break』という命令が実行されます

『break』という命令が実行されると、その命令が含まれる繰り返しの処理を中断し、繰り返し処理を抜けます
今回のサンプルにおけるfor文の条件を見ると10回の繰り返しを行うはずですが、10回繰り返す前に偶数が生成された場合はその周で繰り返し処理が終わっています。

ちなみに『break』の記述を削除すると、繰り返しはきちんと10回行われます。
サンプル等は掲載しませんが、気になる方はご自身で試しに動かしてみてくださいね。

繰り返し処理をスキップする『continue』

『continue』は特定の条件に合致した場合、その繰り返しの周だけをスキップしたい場合に使用します。

『break』が繰り返し自体を中断して終了させたのに対し、『continue』はその周だけをスキップするので繰り返し自体は続行されます。

【サンプル】

for(int i = 0; i < 10; i++) {
	int num = (int)(Math.random() * 10);
	
	if(num % 2 == 0) {
		continue;
	}
	
	System.out.println((i + 1) + "回目の繰り返しです。生成された数値は『" +  num + "』です");
}

【実行結果】(※実行のたびに結果が変わります)

2行目で、『break』の時と同じように1~10の整数をランダムに生成し、『num』という変数に代入しています。
そして4~6行目のif文で、生成された整数が2で割り切れるか(偶数であるか)を判定しています。2で割り切れる場合は『continue』という命令が実行される構造になっていますね。

『continue』という命令が実行されると、その周は『continue』命令以降の記述が無視され次の周へスキップされます。
今回の場合は8行目の標準出力のコードが実行されないということになります。

実行結果を見てみると、生成された整数が奇数の場合だけ標準出力が行われており、偶数の場合は『continue』以降の記述が無視されて次の周にスキップされているのが分かりますね。

『break』や『continue』は使わない?

『break』や『continue』を使用すると通常の繰り返しの構造と比べて少しややこしい動きになりますので、人によっては使いたくない、覚えたくないという方もいるかもしれません。

筆者のこれまでの経験をもとに結果から申し上げますと、『break』や『continue』の使い方も覚えておいた方がよいです。
もちろん通常の構文と比較すると使用頻度は多くはありません。

しかしながら現場で全く使わないような知識かというとそういうわけでもなく、低いながらある程度の頻度では書いたり読んだりしなければならない知識ではあります。

最初からバリバリ使えるようになっておく必要はありませんが、構文を再確認すれば自分で簡単な処理が実装できるくらいの知識は身に着けておいた方がよいと思います。

Java Silverなどの資格取得を目指している方は残念ながら必須の知識となりますので、細かな動きまで追えるようにしておくことをお勧めします。

実行されることが無い『デッドコード』

『break』や『continue』を使用する際に気を付けたほうが良いこととして、『デッドコード』を作らないようにするということが挙げられます。

『デッドコード』は『到達不能コード』とも呼ばれ、処理の流れの関係上コードは記述されているのに実行されることのないコードのことを言います。

言葉で説明しても少し分かり辛いと思いますので、次のサンプルコードを見てください。

【サンプル】

for(int i = 0; i < 10; i++) {
	int num = (int)(Math.random() * 10);
	
	if(num % 2 == 0) {
		continue;
		System.out.println((i + 1) + "回目の繰り返しです。生成された数値は『" +  num + "』です");
	}
}

こちらのサンプルは『continue』の説明の際に使用したサンプルを少し変更したものです。
もともと6行目の標準出力のコードはif文ブロックの外側に記述されていましたが、それを『continue』命令の直後に移動しています。

このコードをよく見てみると、6行目の記述は絶対に実行されることがないコードであることが分かりますね。
どういうことか、処理の流れを追って確認してみましょう。

まず2行目で奇数が生成された場合、4行目の判定は『false』となりますので、そもそもif文ブロックの中に記述されたコードは実行されませんね。

次に2行目で偶数が生成された場合、4行目の判定は『true』となりますが、『continue』命令が実行されるためその周の処理は6行目以降の処理は中断されて次の周へとスキップされてしまいます。

このように6行目に記述されたコードは2行目でどの整数が生成されても絶対に実行されることが無いコードとなってしまいます。
このようなコードのことをJavaでは『デッドコード』もしくは『到達不能コード』という言葉で表現します。

絶対に実行されることの無いコードなので、実際のプログラムには影響を及ぼすことは無いでしょうが、プログラミングの世界では無駄なコードは思わぬバグの温床になりかねないということもあり、エラーとして扱われます。

Eclipseでは上の画像のようにきちんとエラー表示がされますので、気づかないことはないと思います。

このような表示がされてしまった場合はデッドコードを記述してしまっていないか、処理の流れを再度確認してみましょう。