図でわかるJava:while文を絶対に無限ループさせないための対処法

Java

while文を使った繰り返しを行う際に、初心者が絶対に1回はやってしまう無限ループ
そうならないための対処法を紹介します。
しかし、無限ループになってしまう人はまずwhile文についてしっかりを理解できていないかもしれません。

ビギン
ビギン

ヤバい…ループが止まらないどうしよう…

ゆりグル
ゆりグル

そうならないためにもまずはwhile文の仕組みをしっかり学ぼう

while文について

while文は3つのプログラム構造のうちの「繰り返し」のジャンルに入ります。
繰り返しのwhile文には、「while構文」「do-while構文」の2種類があります。
まずは基本の構文について見ていきましょう。

参考記事☟

初心者必見!図でわかるプログラムの3つの制御構造
プログラム作成には欠かせない、プログラムの3つの制御構造「順次」「分岐」「繰り返し」についてJavaのコードで例を見ながら、初心者向けに解説していきます。プログラムの構造を知ることで、複雑なプログラムも一気に読みやすくなります。

while構文(基本形)

while文はブロックを実行する前に条件式を見ます。(条件→ブロック)
まず条件を見てそれがtrue(成り立つ)がfalse(成り立たない)で判断します。
条件がtrue(成り立つ)限り、ブロック内の処理を繰り返します。

 

 

while文のサンプルコード:

package sample;

public class Main3 {
	public static void main(String[] args) {
		int num=1;
		while (num<=5) {
			System.out.println("数字は"+num);
			num=num+1;
		}
	}
}

混乱しそうなときは、ループの処理を1つ1つ言葉にしてみるといいでしょう。

初期値:num=1、条件:数字が5より小さいまたは、等しい限り繰り返す
1週目→num=1 条件:5より小さいのでtrue→表示→数字に1を足す
2週目→num=2 条件:5より小さいのでtrue→表示→数字に1を足す
3週目→num=3 条件:5より小さいのでtrue→表示→数字に1を足す
4種目→num=4 条件:5より小さいのでtrue→表示→数字に1を足す
5週目→num=5 条件:5と等しいのでtrue→表示→数字に1を足す
6週目→num=6 条件:5より小さくも等しくもないのでfalse→抜ける
表示結果:
数字は1
数字は2
数字は3
数字は4
数字は5

do-while構文

一方、do-while構文はブロック内の処理を実行した後に、条件式を見ます。(ブロック→条件)
条件を見た後はwhile文と同じく、条件がtrue(成り立つ)時、繰り返します


 

 

do-while文サンプルコード:

package sample;

public class Main4 {

	public static void main(String[] args) {
		int num=1;
		do {
			System.out.println("数字は"+num);
			num=num+1;
		} while (num<=5);
	}

}

先程のwhile文を処理内容は同じですが、ブロックの処理を先にしてから条件を見ます。

初期値:num=1、条件:数字が5より小さいまたは、等しい限り繰り返す
1週目→num=1 表示→数字に1を足す→条件:num=2は5より小さいのでtrue
2週目→num=2 表示→数字に1を足す→条件:num=3は5より小さいのでtrue
3週目→num=3 表示→数字に1を足す→条件:num=4は5より小さいのでtrue
4種目→num=4 表示→数字に1を足す→条件:num=5は5より小さいのでtrue
5週目→num=5 表示→数字に1を足す→条件:num=6は5より小さくも等しくもないので
false→抜ける
表示結果:
数字は1
数字は2
数字は3
数字は4
数字は5

 

なぜ無限ループになるのか

while文について理解できたところで、
なぜ無限ループになってしまうのか考えていきましょう。
それを考えれば対処法も見つかるはずです。
無限ループになる理由としてはずっとtrueになる条件にしているからです。つまり条件が成り立ち続けてしまうことで、無限ループを引き起こします。

無限ループになる例

ループになり続けるには繰り返すための条件がずっとtrueになってしまっている状態です。

サンプルコード:

package sample;

public class Main5 {

	public static void main(String[] args) {
		int num=10;
		while (num<=10) {
			System.out.println("数字は"+num);
		}
	}

}

表示結果:

数字は10
数字は10
数字は10
・
・
・

条件が数字が10より小さいか等しい場合繰り返します。数字が変わらず10のままなので、永遠にループします。
永遠にループするのが、当たり前ですが…だって数字が変わってないじゃん…
昔はwhile文試そうと思い、こんな感じの作って焦った記憶があります。

あえて無限ループをつくる方法

あえて無限ループを作る方法は簡単です。
繰り返すための条件がずっとtrueになっている状態が無限ループなわけですから、条件trueとしておけば、完了です。

無限ループにならないための対処法

無限ループにならないためには、
条件を抜ける処理を必ず入れることが対処法です。
つまり、いつか条件がfalseになるように、処理を書くということが重要です。
またはループを制御するために使う構文を使うことで繰り返しの中断をすることができます。
例えば「この条件の時に処理を抜ける」のような命令を書くことで、ループを制御できます。

ループを制御する

ループを制御するために使う構文はbreak文というものがあります。
繰り返しの中断をすることができます。

break文

break文を使うことで、その繰り返しの処理自体を止めることができます。
つまり「その条件の時にはループを抜ける」という命令です。

サンプルコード:

package sample;

public class Main6 {

	public static void main(String[] args) {
		int num=1;
		while (num<10) {
			if (num==3) {
				break;
			}
			System.out.println("数字は"+num);
			num++;
		}
	}

}

「もし、数字が3ならばループを抜ける」という処理を入れることで、ループの抜け道を作れました。

表示結果:

数字は1
数字は2

break文を使うことは、while文の条件をfalseにすると考えるよりも簡単かもしれません。
ループを抜ける条件を書き込んで、breakすればループを抜けるので、無限ループになることはありません。

最後に

なぜか最初のころやってしまう無限ループ…
無限ループになるを起こしてしまう人は、while文の仕組み、繰り返しの構文をあまり理解できていなかったのかもしれません。
私も最初あまり理解せずに教科書のコードうつしていただけだったので、自分でサンプルで作ったときに何も考えずにwhile文を試し、無限ループしました。止まらないループにかなり焦ってパニックになった記憶があります(笑)
繰り返しの構文をする時は必ず、図を書いたり、1つ1つの処理を言葉にしてみると良いかと思います。

while文の条件はtrueならば(成り立つ限り)繰り返す

無限ループにならないようにするためには
条件がfalseになるような処理を入れるか、処理を抜ける命令(break文)を入れることで
ループを抜けることができる

コメント

タイトルとURLをコピーしました