break文とcontinue文

7.6 break文とcontinue文

 プログラムを作成していくなかで、for文やwhile文などの繰り返しの流れを「強制的に」変更したい場合がでてくるかもしれません。このような場合に使用するのがbreak文とcontinue文です。

7.6.1 break文

 break文は、第6章のswitch文のところでも出てきました。break文をswitch文で使用すると、「switch文から抜ける」という働きがありましたが、これをループ処理で使用すると、「ループ処理を抜ける」という働きになります。どちらも、そのブロックから抜けるという役割をします。
 ループ処理でのbreak文は、主にif文と組み合わせて使用されます。

 上記の書式はfor文を例にしたものですが、これはwhile文やdo-while文でも同じです。if文の条件判断で、もし条件が一致していたらbreakが処理され、forループを抜けます。

 この流れをフローチャートで表すと、図 7.6.1のようになります。


図 7.6.1 : break文を含むfor文のフローチャート


7.6.2 break文でwhile文の終了を制御するプログラム

 次に作成するプログラムでは、無限にループをし続けるwhile文の処理に、キーボードから値を入力させ、その値によってループを抜ける、というbreak文の流れを確認します。

① ソース・フォルダー      :myproj_intro/src
② パッケージ          :jp.co.f1.intro.ch7
③ 名前             :BreakStatement
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ BreakStatement.java

package jp.co.f1.intro.ch7;

import java.util.Scanner;

public class BreakStatement {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		// 入力値を管理する変数の宣言
		int num;

		while (true) {

			System.out.print("整数値を入力してください(終了したい場合は0を入力) >");

			num = sc.nextInt();

			System.out.println("入力値は" + num + "です。");
			System.out.println();

			if (num == 0) {
				System.out.println(num + "が入力されたため終了します。");
				break;
			}

		}

	}

}

実行結果

解説

 9行目は、数値入力のための準備をしています。12行目は、入力された数値を入れるための変数numを宣言しています。    9: Scanner sc = new Scanner(System.in);
   12: int num;

 14~28行目は、while文です。今までのプログラムと違い、条件式がtrueになっています。今までは、変数を1つ作成し、内部処理が1度行われる度に変数をインクリメントしていき、条件式の条件が最終的には満たされなくなるように作成していました。しかし、これは条件式の条件をtrueとしているので、これだけでは無限にループをし続けることになります。そのため、条件式を別に設けて、一定の条件の時にwhile文を抜ける処理を追加する必要があります。それが、23~26行目のif文です。
   14: while (true) {
   16:   System.out.print("整数値を入力してください(終了したい場合は0を入力) >");
   18:   num = sc.nextInt();
   20:   System.out.println("入力値は" + num + "です。");
   21:   System.out.println();
   23:   if (num == 0) {
   24:         System.out.println(num + "が入力されたため終了します。");
   25:         break;
   26:   }
   28: }

 「1」を入力した場合を例にとって解説します。まず、16行目で入力を促すメッセージが表示されます。18行目が実行されると、キーボードからの数値の入力待ちが行われ、「1」を入力すると変数numに1が代入されます。
   16: System.out.print("整数値を入力してください(終了したい場合は0を入力) >");
   18: num = sc.nextInt();

 20行目で入力した数値を表示し改行します。21行目は文字列を表示せず、改行のみを行います。
   20: System.out.println("入力値は" + num + "です。");
   21: System.out.println();

 23行目のif文の条件式は「num == 0」です。1を入力した場合変数numの値は1なので、条件は満たされません。24、25行目の処理をスキップし、if文を抜けます。if文を抜けるとwhile文の内部処理が全て終了するので、14行目のwhile文の最初に戻ります。
   23: if (num == 0) {
   24:     System.out.println(num + "が入力されたため終了します。");
   25:     break;
   26: }

 次は、「0」が入力された場合です。
14行目のwhile文の条件式はtrueなので、成立します。
18行目で「0」を入力します。
23行目の条件式「num == 0」が成立するので、if文の処理を行います。24行目で、「0が入力されたため終了します。」と表示し、25行目でbreak文が実行されます。break文が実行されると、このwhile文を抜けます。28行目がwhile文の終端で、それ以降の処理はないので、プログラムは終了します。
   23: if (num == 0) {
   24:     System.out.println(num + "が入力されたため終了します。");
   25:     break;
   26: }

 このプログラムで無限ループとなっているwhile文の仕組みとbreak文の役割を、次のフローチャートで見てみましょう。if文の条件を満たしてbreak文が実行されない限り、while文から抜け出すことができないというロジックになっています。

図 7.6.2 : BreakStatementのフローチャート


ポイント

・ ループを中断して終了するにはbreak文を使う。

無限ループのfor文

 while文では、条件式に直接trueを書き込むことによって、無限ループになりました。条件式は、trueであるときにループのブロック内が実行されるので、trueを直に指定した場合は、break文などでループを抜けない限りは無限ループ処理となります。
 while(true) {
 }

 do – while文では以下のようになります。
 do {
 } while( true );

 for文の無限ループは、次のように記述します。

 for( ; ; ) {
 }

 for文の場合は、変数の初期値や条件式などの記述が無くなり、セミコロンだけになります。(半角スペースは空けなくてもかまいません)

Eclipseでのプログラムの強制終了

 Eclipseでプログラムを途中で終了したい場合は、コンソールビューの右上にある終了ボタンを押します。

 無限ループで処理が止まらなくなってしまった場合は、強制終了を行って下さい。

7.6.3 continue文

 break文が処理を中断してループ処理を抜けるのに対して、continue文は後の処理をスキップして元のループ文の先頭に戻り、処理を続行します。 break文とcontinue文の違いをフローチャートで表すと、図 7.6.3のようになります。

図 7.6.2 : BreakStatementのフローチャート


 continue文も、主にif文と組み合わせて使用されます。
 continue文の基本的な使い方は下記のとおりです。

 break文同様、continue文もwhile文やdo-while文でも使用することができます。
 if文の条件判断で、もし条件が一致していたらcontinue文が処理され、forループの最初に戻ります。

 フローチャートは図 7.6.4になります。

図 7.6.4 : continue文を含むfor文のフローチャート


 フローチャートを見ると、continueが実行されると、内部処理のみを飛ばして式3(インクリメントやデクリメント)へ入っています。
 次の項で、実際にプログラムを作成し、動きを確認してみましょう。

7.6.4 continue文でwhile文を制御するプログラム

 キーボードから入力した値によって、while文の処理がどこまで継続されるかを制御するプログラムを作成し、continue文の役割を確認しましょう。

① ソース・フォルダー      :myproj_intro/src
② パッケージ          :jp.co.f1.intro.ch7
③ 名前             :ContinueStatement
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる

➢ ContinueStatement.java

package jp.co.f1.intro.ch7;

import java.util.Scanner;

public class ContinueStatement {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		// 入力値を管理する変数の宣言
		int num;

		// 合計を管理するための変数sumを宣言し、0で初期化
		int sum = 0;

		while(true) {

			System.out.print("整数値を入力してください(終了したい場合は0を入力) >");

			num = sc.nextInt();

			if(num == 0){
				System.out.println("0が入力されたので、処理を終了します。");
				break;
			}else if(num < 0){
				System.out.println("マイナス値は合計されません。");
				System.out.println();
				continue;
			}

			sum += num;

			System.out.println("入力値は" + num + "です。");
			System.out.println("合計値は" + sum + "です。");
			System.out.println();

		}
	}

}

実行結果

解説

 これは、先ほどのbreak文を使ったプログラムであるBreakStatement.javaに、条件によってcontinue文を実行させる処理と、入力した数値を足していく処理を追加したプログラムです。
 17~38行目は、条件式をtrueとした無限ループ処理を行うwhile文です。
   17: while(true) {
   19:   System.out.print("整数値を入力してください(終了したい場合は0を入力) >");
   21:   num = sc.nextInt();
   23:   if(num == 0){
   24:       System.out.println("0が入力されたので、処理を終了します。");
   25:       break;
   26:   }else if(num < 0){
   27:       System.out.println("マイナス値は合計されません。");
   28:       System.out.println();
   29:       continue;
   30:   }
   32:   sum += num;
   34:   System.out.println("入力値は" + num + "です。");
   35:   System.out.println("合計値は" + sum + "です。");
   36:   System.out.println();
   38: }

 21行目は、数値の入力を求め、変数numに入力された数値を代入しています。
   19: System.out.print("整数値を入力してください(終了したい場合は0を入力) >");
   21: num = sc.nextInt();

 「1」を入力した場合を例に解説します。この場合、実行結果は下のようになります。ここでは、既に21行目から1回目のwhile文の内部処理が実行され、次のwhile文の内部処理で19行目までが完了し、21行目が実行中の状態になっています。

 23~30行目は、if – else if文です。「1」を入力した時、23行目のif文の条件式「num == 0」は成立しません。よって、24、25行目をスキップし、26行目の条件式の判定に移ります。「num < 0」という条件式は成立しないので、27~29行目をスキップし、else if文を抜けます。
    23: if(num == 0){
   24:     System.out.println("0が入力されたので、処理を終了します。");
   25:     break;
   26: }else if(num < 0){
   27:     System.out.println("マイナス値は合計されません。");
   28:     System.out.println();
   29:     continue;
   30: }

 そして、変数sumに変数numが足されます。変数sumの値は0で、変数numの値は入力した1です。変数sumの値は1になります。
   32: sum += num;

 34、35行目は、入力した数値と合計値を表示します。36行目の処理が終わると、while文の1回目の内部処理は終わり、while文の最初に戻ります。
   34: System.out.println("入力値は" + num + "です。");
   35: System.out.println("合計値は" + sum + "です。");
   36: System.out.println();

 while文の最初の17行目に戻り、条件式はtrueなので、内部処理に移ります。while文の2回目の内部処理を実行します。21行目で数値の入力を求め、入力された数値を変数numに代入します。
   17: while(true) {
   19:   System.out.print("整数値を入力してください(終了したい場合は0を入力) >");
   21:   num = sc.nextInt();

 下の実行結果は、2回目のループ時に2を入力し、3回目のループ時に0を入力したものです。

 入力された値が0だった場合、23行目の条件式が成立し、24、25行目が実行されます。25行目はbreak文なので、このwhile文から抜けます。while文の終端は38行目で、以降の処理はないためプログラムが終了します。
   23: if(num == 0){
   24:   System.out.println("0が入力されたので、処理を終了します。");
   25:   break;

 下の図は、「-1」が入力された場合を表しています。

 入力された数値が0より小さかった場合は、23行目のif文の条件式にはあてはまりません。そのため、26行目の条件式の判定が行われます。「num < 0」の条件が満たされ、27~29行目の処理が行われます。27行目が実行されると「マイナス値は合計されません。」と表示され、改行されます。29行目では表示する文字列が括弧の中に書かれていないので、改行のみ行います。
 29行目でcontinue文が実行され、while文の最初に戻ります。29行目でcontinueが実行されたことによって、while文以降の内部処理である29~36行目は実行されません。内部処理はそこで完了し、while文の条件式の判定へ移ります。
   26: }else if(num < 0){
   27:     System.out.println("マイナス値は合計されません。");
   28:     System.out.println();
   29:     continue;
   30: }

 このプログラムをフローチャートで表すと、図 7.6.5になります。実際にプログラムを実行しながら、フローチャートの動きを確認してみましょう。

図 7.6.5 : ContinueStatementのフローチャート


ポイント

 ・ ループを途中で中断し、残りの処理をスキップしてループ処理の先頭に戻るときに、continue文を使う。


NEXT>> 7.7 ラベル付きbreak文とラベル付きcontinue文