【Java】ループ処理、ブロック処理を途中で飛ばす
本稿では、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になると外側のループの最初に処理が飛んでいますね。
ディスカッション
コメント一覧
まだ、コメントがありません