【Java】ループ処理、ブロック処理を途中で飛ばす

2018年3月11日

本稿では、break、continueなど処理をジャンプさせるための機能を紹介します。

また、応用でラベルを利用したジャンプ機能も紹介します。

繰り返し処理中にループから抜けるbreak

switch文で使用するbreak文ですが、繰り返し処理の途中で抜けたい時にもbreakが使用できます。

breakを使用すると現在実行中のループ処理のブロックを一つ抜けます。

それでは、breakを使用したプログラムの例を見てみましょう。

public class Test{
	public static void main(String[] args){
		for ( int i = 0;true;i++ ) {
			if ( i > 5 ) {
				break;
			}
			System.out.println(i);
		}
	}
}
実行結果

0
1
2
3
4
5

このプログラムではfor文の条件はtrue(無限ループ)となっていますが、iが5より大きくなったらbreakでループを終了するようになっています。

繰り返し処理中にループの最初に戻すcontinue

ループ中に処理を最初に戻した場合はcontinueが使用できます。

それではcontinueを利用したプログラムを見てみましょう。

public class Test{
	public static void main(String[] args){
		for ( int i = 0;i<5;i++ ) {
			if ( i == 3 ) {
				continue;
			}
			System.out.println(i);
		}
	}
}
実行結果

0
1
2
4

実行結果を見てもらうとわかるように、i==3の時にcontinueで表示処理を実行せずループの最初に戻るため、3が出力されていません。

ラベル付きbreak文を利用しいろんなブロックを抜ける

ラベル付きbreak文を利用することで二重以上のループを抜けることができます。

ラベルはブロック「{}」の前に「ラベル名:」と定義しましょう。

public class Test{
	public static void main(String[] args){
		label:
		for ( int i = 0;true;i++ ) {
			for ( int j = 0;true;j++ ) {
				System.out.println(j);
				if ( j == 3 ) break label;
			}
		}
	}
}
実行結果

0
1
2
3


ラベルを付けることによって、ループ文に限らず、いろんな処理のブロックを抜けることができます。

public class Test{
	public static void main(String[] args){
		label:
		if (true) {
			System.out.println("開始");
			if ( true ) {
				break label;
			}
			System.out.println("終了");
		}
	}
}
実行結果

開始


public class Test{
	public static void main(String[] args){
		label:
		if (true) {
			System.out.println("開始");
			if ( true ) {
				while ( true ) {
					do{
						try{
							if ( true ) break label;
						}catch(Exception e){
						}
						
					}while(true);
				}
			}
			System.out.println("終了");
		}
		System.out.println("処理を一気に抜けました。");
	}
}
実行結果

開始
処理を一気に抜けました。

ただ、break文の使いすぎは非常に可読性が悪くなる(駄目なプログラム)ので通常はあまり使わないほうが良いでしょう。

とくに最後の例は絶対マネしてはいけません。

ラベル付きcontinue文を利用し外側のループの最初から処理を行う

ラベル付きcontinue文を利用することで外側のループの最初まで処理を飛ばすことができます。

public class Test{
	public static void main(String[] args){
		label:
		for ( int i = 0;i < 2;i++ ) {
			for ( int j = 0;j < 10;j++ ) {
				System.out.println(i+":"+j);
				if ( j == 5 ) continue label;
			}
		}
	}
}
実行結果

0:0
0:1
0:2
0:3
0:4
0:5
1:0
1:1
1:2
1:3
1:4
1:5

実行結果を見てもらうとわかるようにj==5になると外側のループの最初に処理が飛んでいますね。

Java

Posted by nompor