Java『while文の書き方』指定条件まで処理を繰り返す|for文との使い分け

Java≫while文の書き方≫指定条件まで処理を繰り返す_for文との使い分け Javaプログラミング入門

【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】

while文の書き方

while文とは、指定した条件になるまで同じ処理を繰り返す構文です。

書き方は以下です。

while (条件) {
    処理
}

プログラムで書くとこのような感じです。

while (i < 10) {
	System.out.println("配列" + i	+ "番目の要素の値は、" + array[i] + "です。");
	i++;
}

whileの後の丸括弧に条件を書きます。

条件には、if文の時と同様に条件式を使います。
条件式の書き方については、以下を参考にしてください。

while文の基本については以下で説明しています。

while文の使い方|サンプルコード

それでは、while文を使ったサンプルコードを見ていきましょう!

カウントが10になるまで、配列に1から順番に値を入れて出力します。

package example;

public class Example {
	public static void main(String[] args) {

		int[] array = new int[10];
		int count = 0;

		while (count < 10) {

			// 現在のカウントに1を足した値を配列に入れる
			array[count] = count + 1;

			// 出力
			System.out.println("配列" + count + "番目の要素の値は、" + array[count] + "です。");

			// カウントを1つ進める
			count++;
		}
	}
}

出力結果は以下です。

配列0番目の要素の値は、1です。
配列1番目の要素の値は、2です。
配列2番目の要素の値は、3です。
配列3番目の要素の値は、4です。
配列4番目の要素の値は、5です。
配列5番目の要素の値は、6です。
配列6番目の要素の値は、7です。
配列7番目の要素の値は、8です。
配列8番目の要素の値は、9です。
配列9番目の要素の値は、10です。

配列は0番目から始まることに注意してください。

また、ここで注目すべき部分は以下の条件式です。

while (count < 10) {

「変数countが10になるまで」という条件になりますが、

プログラム的に見ると、count = 10になった時に処理を終了します。
なので、実際にwhile文の中身が実行されるのは、count = 9までになります。

このように、while文では、条件が満たされている間だけ処理を繰り返す
ということを覚えておいてください!

無限ループとは?

ここで、無限ループのお話です。

while文は、条件が満たされるまでずっと処理を繰り返します。

ということは、条件が満たされないと、処理を永遠に繰り返します。
これを無限ループと呼びます。

先ほどのサンプルコードですが、
18行目の「count++」がないとどうなるでしょう?

 賢いプログラム

「変数countが10になるまで」処理を繰り返すのに、
countは増えなくなります。

つまり、永遠に条件が満たされず無限に処理がループします。

これがwhile文の特徴でもあります。便利な面もありますが、
使い方を間違えると大きな不具合となってしまいます

覚えておきましょう!

また、ここで1点注意ですが、無限ループを実行してしまうと、
処理がひたすら動き、パソコンに負荷がかかってしまうので、
実際にコードを作っても動かさないようにしてくださいね。

実行後に無限ループが発生した時の対処法

と、先ほど注意したにも関わらず、実行してしまった人!

正直に手をあげてください!

 会社のみんな

めっちゃいる!しかもニコニコしている!
そして余裕ぶりがすごい!むしろリスペクトしたくなる!

し、仕方ないですね。
これから無限ループの止め方を伝授しましょう。

無限ループは、eclipseやコマンドプロンプトから止めることができます!

それぞれ無限ループの止め方は以下です!

eclipseで発生した無限ループを止める方法

eclipseで実行した場合は、実行ボタンの横にある
「終了」ボタンをクリックすると処理を強制的に停止することができます。

Java_eclipseで無限ループを止める方法

ただし、処理が複雑でパソコンに大きな負荷がかかった状態では、
eclipse自体が応答なし状態になって動かなくなる場合があります。

その場合は、後述するパソコンからアプリを強制終了させる方法を試しましょう。

コマンドプロンプトで発生した無限ループを止める方法

コマンドプロンプトからJavaを実行している場合は、
以下の操作を行ってください。

Ctrl + Cキー(同時押し)

これは、コマンドプロンプトで実行中の処理をキャンセルする為の操作です。
操作を行って、Javaのコンソール出力が止まれば成功です。

無限ループの処理でパソコンやアプリが動かなくなった時の対処方法

上記の方法で無限ループを止めることができない場合は、
最終手段として、アプリからではなく、

OSの操作を使って直接プログラムを停止する方法があります。

以下の2つの方法があるので、上から順番に試しましょう。

  • Alt + F4キー(同時押し)
  • Alt + Ctrl + Delキー(同時押し)
    > タスクマネージャー起動
    > eclipse、または、コマンドプロンプトを強制終了

1つ目は、今アクティブになっているアプリを強制的に終了するコマンドです。

2つ目は、パソコンの中で起動しているアプリの一覧を表示するコマンドです。
アプリの一覧から、Javaプログラムを実行しているアプリを終了させてください。

いずれも強制的にアプリが終了することになるので、
それまで保存していたプログラムなどは、場合によっては
少し前の状態に戻ってしまうなどあるかもしれません。

処理の途中でwhile文を抜ける方法

条件を満たすまで続く無限ループですが、
何か他のタイミングで処理を終了させたいことも時には出てきます。

そんな時に使えるのが、break文です。
break文を使うことによって、for文と同様に、
while文もループを途中で抜け出すことができます

サンプルコードを見ていきましょう。

while文をネストさせて、多次元配列に1から順に値を入れていきます

また、多次元配列の1グループ目を行、2グループ目を列をして考えます。
縦横が10×10の表に値を1から順に埋めていくイメージですね。

 表計算アプリ

そして、列に値を入れる際は、10列すべてに入れずに、5列目で処理を終了させます。

その他の説明については、コード内のコメントを参照してください。

package example;

public class Example {
	public static void main(String[] args) {

		// 多次元配列
		int[][] array = new int[10][10];
		// 多次元配列(行)
		int row = 0;
		// 多次元配列(列)
		int col = 0;
		// 多次元配列に入れる値
		int count = 0;

		// 行ループ
		while (row < 10) {

			// 列ループ
			while (col < 10) {

				// 値をインクリメントして配列に入れる
				array[row][col] = ++count;

				// 出力
				System.out.println("配列[" + row + "][" + col + "]番目の要素の値は、" + array[row][col] + "です。");

				// 5列目の処理で終了
				if (col == 4) {
					break;
				}

				// 列を1つ進める
				col++;
			}

			// 行を1つ進める
			row++;
			// 行が変わるので列をリセット
			col = 0;
		}
	}
}

実行結果は以下です。長いので途中省略しています。

配列[0][0]番目の要素の値は、1です。
配列[0][1]番目の要素の値は、2です。
配列[0][2]番目の要素の値は、3です。
配列[0][3]番目の要素の値は、4です。
配列[0][4]番目の要素の値は、5です。
配列[1][0]番目の要素の値は、6です。
配列[1][1]番目の要素の値は、7です。
・・・
配列[8][3]番目の要素の値は、44です。
配列[8][4]番目の要素の値は、45です。
配列[9][0]番目の要素の値は、46です。
配列[9][1]番目の要素の値は、47です。
配列[9][2]番目の要素の値は、48です。
配列[9][3]番目の要素の値は、49です。
配列[9][4]番目の要素の値は、50です。

結果を見ると、行ごとに5列ずつ値が入ってますね!

そして、while文をbreakしたときも、for文の時と同様に、
ブロック1つ分(ループ処理1つ分)だけ抜ける動きになっています。

ちなみにこの例では、学習の為に、無限ループをネストしましたが、
実際に仕事で使うようなプログラムでは、不具合の原因となる為、
あまりこのようなロジックは好まれません。

どうしてもこういった動きが必要な時だけ実装するようにしましょう!

処理を飛ばして次のループまでスキップする方法

次はループ処理を抜けるのではなく、
途中でスキップして次のループ処理に移る方法です。

こちらも、for文の時と同様に、continue文を使います。

さっそくサンプルコードを見ていきましょう!

先ほど使ったbreak文のサンプルを少しいじってみました。

6列目以降のループでcontinueを使ってスキップするようにしています。

また、処理がスキップされたことがわかるように、
配列に値を入れる前と後で2回メッセージを出力するようにしました。

package example;

public class Example {
	public static void main(String[] args) {

		// 多次元配列
		int[][] array = new int[10][10];
		// 多次元配列(行)
		int row = 0;
		// 多次元配列(列)
		int col = 0;
		// 多次元配列に入れる値
		int count = 0;

		// 行ループ
		while (row < 10) {

			// 列ループ
			while (col < 10) {

				// 値をインクリメントして配列に入れる
				array[row][col] = ++count;

				// 出力(1回目)
				System.out.println("配列[" + row + "][" + col + "]番目の要素の値を出力します。");

				// 6列目以降の処理はスキップ
				if (col > 4) {
					// 列を1つ進める(スキップして列ループを進める為)
					col++;
					continue;
				}

				// 出力(2回目)
				System.out.println("配列[" + row + "][" + col + "]番目の要素の値は、" + array[row][col] + "です。");

				// 列を1つ進める(出力メッセージに変数colの値を使うので、出力の後に1つ進める)
				col++;
			}

			// 行を1つ進める
			row++;
			// 行が変わるので列をリセット
			col = 0;
		}
	}
}

実行結果は以下です。長いので途中省略しています。

配列[0][0]番目の要素の値を出力します。
配列[0][0]番目の要素の値は、1です。
配列[0][1]番目の要素の値を出力します。
配列[0][1]番目の要素の値は、2です。
配列[0][2]番目の要素の値を出力します。
配列[0][2]番目の要素の値は、3です。
配列[0][3]番目の要素の値を出力します。
配列[0][3]番目の要素の値は、4です。
配列[0][4]番目の要素の値を出力します。
配列[0][4]番目の要素の値は、5です。
配列[0][5]番目の要素の値を出力します。
配列[0][6]番目の要素の値を出力します。
配列[0][7]番目の要素の値を出力します。
配列[0][8]番目の要素の値を出力します。
配列[0][9]番目の要素の値を出力します。
配列[1][0]番目の要素の値を出力します。
配列[1][0]番目の要素の値は、11です。
配列[1][1]番目の要素の値を出力します。
配列[1][1]番目の要素の値は、12です。
・・・
配列[8][8]番目の要素の値を出力します。
配列[8][9]番目の要素の値を出力します。
配列[9][0]番目の要素の値を出力します。
配列[9][0]番目の要素の値は、91です。
配列[9][1]番目の要素の値を出力します。
配列[9][1]番目の要素の値は、92です。
配列[9][2]番目の要素の値を出力します。
配列[9][2]番目の要素の値は、93です。
配列[9][3]番目の要素の値を出力します。
配列[9][3]番目の要素の値は、94です。
配列[9][4]番目の要素の値を出力します。
配列[9][4]番目の要素の値は、95です。
配列[9][5]番目の要素の値を出力します。
配列[9][6]番目の要素の値を出力します。
配列[9][7]番目の要素の値を出力します。
配列[9][8]番目の要素の値を出力します。
配列[9][9]番目の要素の値を出力します。

6列目以降の処理がスキップされて、
次の行のループ処理に移っていることがわかります。

こちらもネストした場合は、
今実行されているループブロック内の先頭に戻る動きになるので
覚えておきましょう!

while文とfor文の違いは?どのように使い分けるか?

ここまでwhile文について説明してきましたが、
実際にプログラムを書く時、for文との使い分けはどうすれば良いでしょう?

プログラマーの感覚による部分が大きいので正解というものはないですが、
自分で判断がつけにくいという人は、以下の基準を参考にして使い分けていきましょう。

【for文の使いどころ】
・処理を繰り返す回数が決められる場合
・ループカウントを使いたい場合
・ネストしたい場合
・ループごとに特別な処理を実行したい場合(変化式を使う)

【while文の使いどころ】
・条件が揃うまで処理を繰り返したい場合
・何かのステータスを監視する場合
・負荷テストを行う場合

while文は、基本的に無限に処理を繰り返す為の処理です。

終了条件の発生パターンなどしっかり把握せずに使ってしまうと、
バグを生んだり、システムに負荷をかける原因となります。

 動かなくなったプログラム

仕事などでプログラムを作っていて、繰り返し処理が必要な時は、
基本的にはfor文を使って、実現できない場合にwhile文を使うという流れがおすすめです!

for文の使い方については、以下で詳しく説明していますので、
あわせて読んでいただくとより理解が深まると思います!

do while文とは?while文との違いと使い方

while文に似た構文で、do while文というのがあります。

do while文とは、1ループ目は必ず処理を実行する繰り返し構文のことです。

書き方は以下です。
whileの後にセミコロン「;」が必要なので忘れないようにしましょう!

do {
  処理
} while(条件);

サンプルコードは以下です。

package example;

public class Example {
	public static void main(String[] args) {

		int count = 0;

		do {
			// カウントを1つ進めて出力
			System.out.println(++count + "回目の出力です。");
		} while (count > 100);
	}
}

実行結果は以下です。

1回目の出力です。

どうでしょう?イメージしていた通りでしょうか?

条件が「count > 100」なのに、1回目の出力が実行されていますね。
もしかしてバグ!?

いえいえ、これがdo while文の特徴です。

なぜこんな動きになるんでしょう?

 疑問に思う人

do while文は、プログラムの構造を見ると動きが理解できます。

なぜなら、プログラムは上から下に実行していくので、
doの中の処理を実行してから、whileの中の条件を判断する
ことになります。

つまり、doブロックの中の処理は必ず通るという動きになるわけです。

実際には使いどころが少ないdo while文ですが、
このような構文があることを覚えておいてください。

まとめ

while文について以下説明しました。

  • while文の書き方
  • while文の使い方
  • 無限ループと発生時の対処法
  • while文を抜ける方法(break文の使い方)
  • while文のループをスキップする方法(continue文の使い方)
  • while文とfor文の使い分け
  • do~while文の使い方

while文をプログラムで使う時は、細心の注意が必要になる構文なので、
しっかり要点を押さえて使っていくようにしましょう!

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