break文とcontinue文
7.4 break文とcontinue文
プログラムを作成していくなかで、for文やwhile文などの繰り返しの流れを「強制的に」変更したい場合がでてくるかもしれません。このような場合に使用するのがbreak文とcontinue文です。
7.4.1 break文
break文をループ処理で使用すると、「ループ処理を抜ける」働きになります。
ループ処理でのbreak文は、主にif文と組み合わせて使用されます。
書式:breakの基本的な使い方
上記の書式はfor文を例にとっていますが、これはwhile文やdo-while文でも同じです。if文の条件判断で、もし条件が一致していたらbreakが処理され、forループを抜けます。
フローチャートで表すと、図 7.4.1のようになります。
図 7.4.1 break文を含むfor文のフローチャート
7.4.2 break文でwhile文の終了を制御するプログラム
無限ループのwhile文の処理にキーボード入力を含み、入力された値によりbreak文でループを抜けるプログラムを作成します。
① ソース・フォルダー :myproj_super_intro/src
② パッケージ :jp.co.f1.superintro.ch07
③ 名前 :BreakStatement
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ BreakStatement.java
package jp.co.f1.superintro.ch07; import java.util.Scanner; public class BreakStatement { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //カウント変数 int count = 0; System.out.println("**ループ開始**"); while(true){ System.out.print("ループを続けるなら「y」を入力して下さい > "); String result = sc.nextLine(); //入力判定 if(result.equals("y")){ //カウントを1増やす count++; System.out.println(count+"回目のループです。"); System.out.println(); }else{ System.out.println("y以外の"+result+"が入力されたので終了します。"); break; } } System.out.println("**ループ終了**"); } }
実行結果
実行直後
yを入力し、Enterキーを押した場合
n(y以外)を入力し、Enterキーを押した場合
解説
9行目は、数値入力のための準備をしています。12行目は、ループ回数を数えるための変数countを宣言し0で初期化しています。
15~29行目は、while文です。今までのプログラムと違い、条件式がtrueになっています。今までは、変数を1つ作成し、内部処理が1度行われる度に変数をインクリメントしていき、条件式の条件が最終的には満たされなくなるように作成していました。しかし、これは条件式の条件をtrueとしているため、これだけでは無限にループをし続けることになります。そのため、条件式を別に設けて一定条件の時にwhile文を抜ける処理を追加する必要があります。それが、20~28行目のif-else文です。
「y」を入力した場合を例にとって解説します。16行目で入力を促すメッセージが表示されます。17行目が実行されると、キーボードからの入力待ちが行われ、「y」を入力すると変数resultにyが代入されます。
20行目で入力された文字を判定し「y」ならifブロックの処理を実行します。22行目で変数countをインクリメントしてループ回数を1増やします。23行目でループ回数を表示させ、24行目で改行を行います。この処理の後はループの先頭に戻り再度16、17行目のキーボードからの入力処理待ちになります。
17行目の処理で「y以外(例えばn)」が入力された場合、25行目のelseブロックに処理を実行します。
26行目メッセージを表示し、27行目のbreak文が実行されます。break文が実行されると、このwhile文を抜けます。
このプログラムの無限ループとなっているwhile文の仕組みとbreak文の役割を、フローチャートの図 7.4.2で見てみましょう。if文の条件を満たしてbreak文が実行されない限り、while文から抜け出すことができないというロジックになっているのが確認できます。
図 7.4.2 BreakStatementのフローチャート
◉ポイント
・ ループを中断して終了するにはbreak文を使う。
無限ループのfor文
while文では、条件式に直接trueを書き込むことによって、無限ループになりました。条件式はtrueであるときにループのブロック内が実行されるので、trueを直に指定した場合は、break文などでループを抜けない限りは無限ループ処理となります。
while(true) {
}
do – while文では以下のようになります。
do {
} while( true );
for文の無限ループは、次のように記述します。
for( ; ; ) {
}
for文の場合は、変数の初期値や条件式などの記述が無くなり、セミコロンだけになります。(半角スペースは空けなくてもかまいません)
Eclipseでのプログラムの強制終了
Eclipseでプログラムを途中で終了したい場合は、コンソールビューの右上にある終了ボタンを押します。
無限ループで処理が止まらなくなってしまった場合は、強制終了を行って下さい。
7.4.3 continue文
break文が処理を中断してループ処理を抜けるのに対して、continue文は後の処理をスキップして元のループ文の先頭に戻り、処理を続行します。
break文とcontinue文の違いをフローチャートで表すと、図 7.4.3のようになります。
図 7.4.3 break文とcontinue文の処理の違い
continue文も、主にif文と組み合わせて使用されます。
continue文の基本的な使い方は下記のとおりです。
書式:continue文の基本的な使い方
break文同様、continue文もwhile文やdo-while文でも使用することができます。
if文の条件判断で、もし条件が一致していたらcontinue文が処理され、forループの最初に戻ります。
フローチャートは図 7.4.4になります。
図 7.4.4 : continue文を含むfor文のフローチャート
フローチャートを見ると、continueが実行されると、内部処理のみを飛ばして式3(インクリメントやデクリメント)へ入っています。
continueを使ったサンプルプログラムは少し複雑な内容になるため超入門では紹介致しませんが、Java入門講座では学習することができます。
break文とcontinue文を上手に利用すれば、ループ処理内容を分り易い内容にまとめることができます。状況に応じて使えるように覚えておきましょう。
7.4.4 continue文でwhile文内の処理の流れを制御するプログラム
無限ループのwhile文の処理にランダムな数値(1~9)を発生させ、その発生した数値によって処理を制御します。数値が4の場合は特別なメッセージを表示させ、再度ループの先頭に戻り、その他の数値は発生させた数値を画面に表示させます。また、4以外の偶数数値が出た場合は、無限ループから抜けてプログラムが終了するように作成します。
① ソース・フォルダー :myproj_super_intro/src
② パッケージ :jp.co.f1.superintro.ch07
③ 名前 :ContinueStatement
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ ContinueStatement.java
package jp.co.f1.superintro.ch07; public class ContinueStatement { public static void main(String[] args) { System.out.println("**ループ開始**"); while(true){ //1から9のランダムな数値を取得 int num = (int)(Math.random()*9)+1; if(num==4){ //4の場合は再度ループの先頭に戻る System.out.println(num+"が出たので、ループの先頭へ戻ります!"); continue; } //ランダム数値の表示 System.out.println("ランダム数値="+num); if(num%2==0){ //偶数数値なら無限ループから抜ける System.out.println("4以外の偶数数値が出たので、ループから抜けます!"); break; } } System.out.println("**ループ終了**"); } }
実行結果
解説
このプログラムはほとんどの処理全体を、8~27行間のwhile文の無限ループ内に含まれています。ある条件の場合にbreak文で無限ループを抜けるように設定しています。
11行目は、キーボード入力機能(Scannerクラス)のように、Javaがはじめから用意してくれているMathクラスのramdom()メソッドを利用してランダム数値を発生させています。サンプルのように記述すると、1~9の範囲でランダム数値を1つ取得できるようになっています。掛け算記号(*)の後ろにある数値を増減すると範囲も増減させることができます。また括弧の外にある「+1」を外すと「0」を含んだ範囲にすることもできます。たとえば、0~99の範囲のランダム数値を得たい場合は、「(int)(Math.random()*100)」のように記載します。ぜひ試してみてください。
13~17行目ではランダムで発生させた数値が4と等しい場合に、15行目のメッセージを画面に表示します。16行目のcontinue文でループの先頭(8行目)に戻るようになっています。continue文が実行されると、while文内でのそれ以降の処理はスキップされループの先頭に戻るのが特徴です。
20行目ではランダムで発生させたランダム数値を表示します。
22行目は偶数かどうかを判断しています。22~26行目はランダムで発生させた数値が偶数である場合、24行目のメッセージを画面に表示し、25行目でbreak文が実行されると、ループから抜けます。
◉ポイント・ ループ文内でcontinue文が実行されると、continue文以降の処理をスキップしてループの先頭に戻ります。
このプログラムの無限ループとなっているwhile文の仕組みとcontinue文、break文の役割を、フローチャートの図 7.4.2で見てみましょう。ランダム数値がnum=4の場合は以降の処理をスキップして先頭に戻っているのが確認できます。
図 7.4.5 : ContinueStatementのフローチャート