|
|
|||||||||||||||||||||||||||||
| 処理の流れを制御 |
H.Kamifuji . |
|
繰り返し処理や条件分岐などを使用する時に、繰り返しを抜け出したりスキップしたりする方法を確認します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
|
|
break文はfor文、while文、do..while文、switch文のブロック内で使用され、break文が実行されるとブロックを抜けて次の処理へ移ります。break文の書式は次のようになっています。 break;switch文の中でbreak文をどのように使うのかについては「switch文」を参照して下さい。まずはfor文での使い方かた確認します。 for文は条件式がtrueの間、ブロック内の処理を繰り返し実行しますが、break文が実行されるとfor文を終了し次の処理へ移ります。
for (初期化式; 条件式; 変化式){
...
if (条件式){
break;
}
...
}
if文などと組み合わせてbreak文を記述します。(if文などと組み合わせなければ、必ず1回目の繰り返しの途中でbreak文が実行されfor文が終了してしまいます)。実際には次のように記述します。
int sum = 0;
for (int i = 1; i %lt;= 100; i++){
sum += i;
if (sum > 100){
break;
}
}
System.out.println("sum = " + sum);
この場合、1から100までの数値を順に加算していきますが、合計が100を超えた時点でbreak文を実行しfor文を終了し次の文へ処理が移ります。while文の場合も基本的に同じです。繰り返しの途中でbreak文が実行されるとwhile文を終了し次の処理へ移ります。
while (条件式){
...
if (条件式){
break;
}
...
}
実際には次のように記述します。
int num = 1;
while(true){
System.out.println(num);
num++;
if (num > 100){
break;
}
}
この場合、while文の条件式が「true」となっていますので条件式を評価した結果は常に「true」となりこのままでは無限ループとなります。ただし変数「num」の値が100を越えたらbreak文が実行されwhile文が終了します。do..while文の場合も基本的には同じです。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample1_1{
public static void main(String args[]){
int sum;
sum = 0;
for (int i = 1; i <= 100; i++){
sum += i;
}
System.out.println("sum = " + sum);
sum = 0;
for (int i = 1; i <= 100; i++){
sum += i;
if (sum > 100){
break;
}
}
System.out.println("sum = " + sum);
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Break]$ java JSample1_1 sum = 5050 sum = 105 [xxxxxxxx@dddddddddd Break]$ java JSample1_1今回は同じ条件式のfor分を使い、break文がある場合と無い場合で試しました。break文がある場合は繰り返し処理が途中で終了していることが確認できます。 |
|
for文やwhile文のブロック内でbreak文が実行されるとブロックを抜けて次の処理へ移りますが、繰り返し処理が多重になっている場合にbreak文が実行された場合にどうなるのかを確認します。 次の例を見てください。
for (int i = 1; i <= 5; i++){
int sum = 0;
for (int j = 1; j <= 9; j++){
if (i * j > 20){
break;
}
System.out.println(i + "*" + j + "=" + (i * j));
}
/* 内側のfor文のブロック内でbreak文が実行されるとここへ処理が移る */
}
/* 外側のfor文のブロック内でbreak文が実行されるとここへ処理が移る */
上記はfor文の中にfor文が記述されています。そして内側のfor文の中にbreak文が記述されています。この場合、for文が実行されると、for文を含んでいる一番内側の繰り返し処理だけを抜けて次の処理へ移ります。その為、break文が実行されたfor文の外にあるfor文の処理の流れには影響を及ぼしません。今回は2重になったfor文でしたが3重であっても同じことです。またwhile文やdo..while文でも同じです。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample2_1{
public static void main(String args[]){
for (int i = 3; i <= 5; i++){
int sum = 0;
System.out.println(i + "の行開始");
for (int j = 1; j <= 9; j++){
if (i * j >= 10){
break;
}
System.out.println(i + "*" + j + "=" + (i * j));
}
System.out.println(i + "の行終了");
}
System.out.println("計算終了");
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Break]$ java JSample2_1 3の行開始 3*1=3 3*2=6 3*3=9 3の行終了 4の行開始 4*1=4 4*2=8 4の行終了 5の行開始 5*1=5 5の行終了 計算終了 [xxxxxxxx@dddddddddd Break]$break文によって内側の繰り返し処理は途中で処理を終了しますが、外側の繰り返し処理には影響をあたえません。 |
|
break文が実行されるとbreak文を含む一番内側のブロックを抜けますが、ラベル付きのbreak文にすることで任意のブロックを抜けることができます。ラベル付きbreak文の書式は次の通りです。 break ラベル;breakの後にラベルを付けて実行します。次に抜ける対象となるブロックにラベルを付けます。基本的な書式は次のようになります。
ラベル: {
...
break ラベル;
...
}
for文やwhile文の前に「ラベル:」のようにラベルを付けます。この時、break文はラベルを付けたブロックの中に記述されている必要があります。次の例を見てください。
outside: for (int i = 1; i < 5; i++){
for (int j = 1; j < 5; j++){
if (i * j > 10){
break outside;
}
System.out.println(i + "*" + j + "=" + (i * j));
}
}
ラベルが無いbreak文では一番内側のブロックを抜けるだけですが、ラベル付きbreak文が実行されると、指定されたラベルが付けられたブロックを抜けます。よって上記の場合はif文の条件式がtrueになると一番外側のfor文を抜けます。ラベルはfor文やwhile文だけではなくif文やブロックだけのものに付けることもできます。
outside:{
for (int i = 1; i < 5; i++){
for (int j = 1; j < 5; j++){
if (i * j > 10){
break outside;
}
System.out.println(i + "*" + j + "=" + (i * j));
}
}
}
ラベル付きbreak文は多重ループを抜ける場合に便利ですが、あまり多用するとプログラムが分かりにくくなる場合もありますので注意して使うようにして下さい。では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample3_1{
public static void main(String args[]){
outside: for (int i = 1; i < 5; i++){
for (int j = 1; j < 5; j++){
if (i * j > 10){
break outside;
}
System.out.println(i + "*" + j + "=" + (i * j));
}
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Break]$ java JSample3_1 1*1=1 1*2=2 1*3=3 1*4=4 2*1=2 2*2=4 2*3=6 2*4=8 3*1=3 3*2=6 3*3=9 [xxxxxxxx@dddddddddd Break]$ |
|
continue文はbreak文と同じくfor文、while文、do..while文のブロック内で使用され、continue文が実行されると実行された位置からブロックの最後まで残りの処理をスキップします。continue文の書式は次のようになっています。 continue;スキップという意味が分かりにくいかもしれませんが、次の例を見て下さい。
for (int i = 0; i < 10; i++){
if (i == 3){
continue;
}
System.out.println(i);
}
上記では変数「i」の値が3の時にcontinue文が実行されます。continue文が実行されるとブロック内でそれ以降に記述された処理を全て行わずに次の繰り返しの条件判断に進みます。つまり上記の場合は変数「i」の値が3の時だけ「System.out.println(i);」が実行されません。なおfor文の場合は変化式が別途用意されているので気にしなくても大丈夫ですが、while文などでは条件式の値を変化させる処理も含めてスキップさせてしまわないように気をつけて下さい。 例えば次のように記述してしまうと変数「i」が3になると変数「i」の値を変化させる処理もスキップしてしまうため、次の繰り返し処理になっても変数「i」の値が変化せずに無限ループとなってしまいます。
int i = 0;
while(i < 10){
if (i == 3){
continue;
}
i++;
System.out.println(i);
}
なおbreak文と同じく繰り返し処理が多重になっている場合には、continue文を含む一番内側の繰り返し処理をスキップして次の繰り返しへ移ります。任意の繰り返し処理をスキップさせるには次のページで解説するラベル付きcontinueを使って下さい。では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample4_1{
public static void main(String args[]){
for (int i = 1; i < 10; i++){
if (i % 2 == 0){
continue;
}
System.out.println("i = " + i);
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Break]$ java JSample4_1 i = 1 i = 3 i = 5 i = 7 i = 9 [xxxxxxxx@dddddddddd Break]$今回は値が偶数の場合だけそれ以降の処理をスキップしています。 |
|
continue文が実行されると、continue文を含む一番内側のブロックのcontinue文以降の処理をスキップしますが、ラベル付きのcontinue文にすることで任意のブロックの最後まで処理をスキップさせることができます。ラベル付きbreak文の書式は次の通りです。 continue ラベル;continueの後にラベルを付けて実行します。次に抜ける対象となるブロックにラベルを付けます。基本的な書式はbreak文の場合と同じで次のようになります。
ラベル: while(条件式){
...
continue ラベル;
...
}
for文やwhile文の前に「ラベル:」のようにラベルを付けます。この時、continue文はラベルを付けたブロックの中に記述されている必要があります。次の例を見てください。
outside: for (int i = 1; i < 5; i++){
for (int j = 1; j < 5; j++){
if (i * j > 10){
continue outside;
}
System.out.println(i + "*" + j + "=" + (i * j));
}
}
ラベルが無いcontinue文では一番内側のブロックの最後までスキップされるだけですが、ラベル付きcontinue文が実行されると、指定されたラベルが付けられたブロックの最後までの処理がスキップされ次の繰り返しに移ります。よって上記の場合はif文の条件式がtrueになると一番外側のfor文の最後まで処理がスキップされ次の繰り返しに入ります。なおbreak文と異なりcontinue文ではif文やブロックだけのものにラベルを付けて使用することはできません。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。
class JSample5_1{
public static void main(String args[]){
outside: for (int i = 1; i < 5; i++){
for (int j = 1; j < 5; j++){
if (i * j > 8){
continue outside;
}
System.out.println(i + "*" + j + "=" + (i * j));
}
}
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Break]$ java JSample5_1 1*1=1 1*2=2 1*3=3 1*4=4 2*1=2 2*2=4 2*3=6 2*4=8 3*1=3 3*2=6 4*1=4 4*2=8 [xxxxxxxx@dddddddddd Break]$ |
|