多重ループの実行中に外側のfor文を一気に抜け出す方法として、ラベル付きbreak文が便利です。
ではさっそく使用例を見ていきましょう。
このプログラムは、5個の整数を1グループとして、全10グループの合計を求めます。
その都度入力をして、小計を求めていくことができますが、次のようなコマンドを入力すると、途中で中断できるようになっています。
9999を入力⇒全体の入力を終了
8888を入力⇒小計の入力を中断し、次のグループへ
プログラムの注目すべき点は、11行目のOuter、15行目のInnerがそれぞれのfor文に付いている点です。
これらのことを『ラベル付き文』といいます。
『定義 ラベル付き文
識別子 : 文 』
プログラムの流れがラベル付きbreak文に差し掛かると、そのラベルを持つ繰り返し文のブロックを抜けます。
そのため、今回のプログラムを解説すると、
6行目ではScannerクラスのインスタンス化を行い、コンストラクタの引数でSystem.inを設定してます。
System.inはキーボードと結びついた標準入力ストリームで、簡単に説明すると、キーボードから入力された値を使うための準備をしています。
8行目でユーザーに対して、「整数を加算します。」と出力をし、今から行うことが分かるように表示しています。
そして、9行目では、全グループの合計を求める用のint型の変数totalを宣言しています。
11行目ではOuterというラベル付き文の宣言をしています。そのため、12行目から始まるfor文にOuterというラベルを付けたことになります。
このfor文は、iが1からスタートし、10回繰り返す繰り返し文です。
13行目で「第〇グループ」と何回目の繰り返しか分かるように出力をしています。
そして、14行目では、このグループの小計を求める用のint型の変数sumを宣言しています。
15行目では、Innerというラベル付き文の宣言をしています。これは、16行目から始まるfor文にInnerというラベルを付けたことになります。
このfor文は、jが0からスタートし、5回繰り返す繰り返し文です。
18行目ではScannerクラスのnextInt()メソッドを使用し、キーボードからの入力を受け付けます。
19行目からの条件分岐のif文で、入力された数値が『9999』か『8888』かをチェックしています。
もし、『9999』が入力されたならば、20行目に処理が行きます。
そして、ラベル付きbreak文である、「break Outer」の処理を実行することになるため、処理はOuterラベルの付いたfor文のブロックを突き抜けます。
そのため、29行目の処理に飛び、合計の出力をして処理が終わります。
もし、『8888』が入力されたのであれば、22行目に処理が行きます。
そして、「break Inner」を実行することになるため、処理はInnerラベルの付いたfor文のブロックを突き抜けます。
そのため、26行目の処理に飛び、小計を出力後、外側のfor文の繰り返し処理を実行していくことになります。
解説は以上です。
ラベル付きbreak文無くとも条件分岐等で抜けることはできなくはないですが、処理が嵩張るため、非常に見ずらくなります。
知らなかったという方は、是非ご参考にしてください。
※補足・・・ラベル付きcontinueも同様に使用できます。