Javaについて徹底解説!

Javaの繰り返しの基本while文 for文との使い分け方針も!

大石 英人

大石 英人

開発エンジニア/Java20年/Java GOLD/リーダー/ボールド歴2年

while文はJavaで繰り返しをするための構文の一つです。何かの条件を満たしている間、ずっと処理を繰り返し続けるものです。

while文はfor文よりシンプルな構文ですので、コツが分かればすぐ使えます。この記事は初心者向けに記述していますので、ぜひ学んで行ってください。ここで覚えれば、他のプログラミング言語でも同じように使えますよ。

なお、慣れないうちは、同じような繰り返し構文であるfor文と、使い分けに迷うことが多いものです。その考え方の例も記述しましたので、ぜひ参考にしてください!

※この記事のサンプルは、Java 10の環境で動作確認しています。


1.while文の基本

1-1.while文は条件式と処理部の繰り返し

while文は「条件式」と「処理部」の二つからなります。

while (①条件式) {
	②処理部
}

Whileについて解説

while文は必ずの条件式から始まります。条件式は、実行した結果が必ずbooleanにならなければなりません。booleanでなければコンパイルエラーです。これがJavawhileにおける大きな特徴です。

この条件式の結果がtrueの場合にだけ、の処理部が実行されます。falseの場合はwhile文が終了し、while文の次にある処理に移ります。

処理部での処理が「{}」でくくられた最後まで行くと、またの条件式が実行されます。あるいは、後述するcontinuebreakが実行されても処理部は終了します。

このように、while文はwhile文を実行するかどうかの条件判断と、繰り返し処理の本体である処理部の実行が交互に行われるものです。

1-2.while文の例

簡単な例でwhile文の動きを示します。これは2回処理を繰り返すものです。変数iが加算されつつ、条件式処理部と動くことで、全体として2回繰り返されることが分かるでしょうか。

int i = 0;

while (i < 2) {
	System.out.println((i + 1) + "回目の繰り返しです。");
	i++;
}

条件式:i < 2

処理部:System.out.println i++

  1. 0 < 2 → trueなので処理部が実行される
  2. iの値を出力した後、0 +1 されて 1 になる
  3.  1 < 2 → trueなので処理部が実行される
  4. iの値を出力した後、1 +1 されて 2 になる
  5. 2 < 2 → falseなのでwhile文が終了する

2.while文の勘所

2-1.条件式は必ずboolean!

前述したとおり、条件式は必ずbooleanでなければならず、booleanにならない場合はコンパイルエラーです。

逆に言えば、最終的にbooleanになればいいので、if文のように複数の条件を && || で組み合わせても大丈夫です。メソッドを実行した結果のbooleanでも構いません。

boolean b1 = true;
boolean b2 = true;

while (b1 && b2) {
	// 処理結果で b1/b2 の値が変わる
}
List<Integer> list = Arrays.asList(1, 2, 3);
Iterator<Integer> it = list.iterator();

// hasNextがtrueを返す限り、繰り返しを続ける
while (it.hasNext()) {
	System.out.println(it.next());
}

なお、Javaは他のプログラミング言語とは違い、0“”nullなどはbooleanでの判断が必要な箇所でfalse扱いされません。条件式の部分でコンパイルエラーが出る時は、この観点で調べてみましょう。

2-2.continueすると次の繰り返しへ

処理部でcontinueを実行すると、今の処理部はその時点で中断されて、条件式へ処理が移ります。今の繰り返しはもう終わらせてもいいけれど、while文自体は続けたい、という場合に使います。

continueはif文と組み合わせることが普通でしょう。処理の途中で終わらせてもいい、と判断できた場合に使うものだからです。

int i = 0;

while (i < 10) {
	// iが偶数の場合は何もせず次の繰り返しへ行く
	if (i % 2 == 0) {
		i++;
		continue;
	}

	System.out.println(i); // → 1,3,5,7,9を表示
	i++;
}

2-3.breakするとすぐにwhile文を終了する

処理部でbreakをすると、その時点ですぐにwhile文を終了します。条件式も実行されません。もうこれ以上while文を実行する必要はない、という場合に使います。

breakもif文と組み合わせるのが普通でしょう。普通なら処理部をすべて実行するのに、特定の条件を満たせば終わらせたいからです。

int i = 0;

while (i < 10) {
	// iが5を超えたならwhile文を終わらせる
	if (i > 5) {
		break;
	}

	System.out.println(i); // → 0,1,2,3,4,5を表示
	i++;
}

2-4.無限ループには気を付けて!

以下のwhile文はいわゆる無限ループです。条件式が常にtrueですので、while文の処理部は常に実行されます。

ですから、何かの条件を満たした場合にbreakしなければならないことが普通です。breakの代わりにreturnしてメソッドを終わらせることでも、無限ループを終わらせられます。

// 無限ループになってしまっており、このままではwhile文が終わらない!!
while (true) {
	// 何かの処理
}
// 普通は何かの条件でbreakするようにする
while (true) {
	if (何かの条件) {
		break;
	}
	// 何かの処理
}

無限ループは、何回実行すればいいかは事前に分からないけれども、終わる条件は明確な場合に使います。

例えば、ファイルを開いてすべての行を読み取る時、当然ファイルの行数は分かりませんが、ファイルの最後に達したならば終了していいのです。


3.【参考】while文とfor文との使い分け

Javaで繰り返し処理を行うにはfor文も使えます。出来ることは似通っていますので使い分けに悩む方もいるでしょう。

while文・for文にはそれぞれ特徴がありますので、例えば以下のように使い分けてみてはどうでしょうか。

3-1.for文:繰り返す回数が決まっている場合

始めと終わりの範囲・数字が明確になっている場合はfor文の出番です。例えば、繰り返しの回数があらかじめ決まっていたり、通しで処理したい配列やListがあるなどです。

何かを繰り返す時は、普通はカウンター用の変数を使います。そのような変数は繰り返し処理の中でしか使わないことが多いものです。for文の初期化式でカウンター変数を宣言すれば、for文の外からは使えない変数となりますので、プログラム全体が読みやすくなります。

それに、for文は繰り返し内で必ず実行される反復式でカウンターを増減させられますので、どこでカウンターが管理されているかが大変分かりやすくなります。

// iはfor文の中だけなので、後ろでもiという変数を使える
// 反復式は必ず実行されるので、カウンターの増減にはもってこい!!
for (int i = 0; i < 5; i++) {
	System.out.println(i);
}

while文だと、カウンターとして用いる変数をwhile文の外側で宣言しなければならないので、以後はその変数を新しく宣言できません。プログラム全体で1つの変数を複数の役割で使いまわすのは、ミスの原因になりがちです。

それに、while文ではカウンター変数の更新をし忘れるのはfor文以上です。これは良くある「うっかりミス」の一つですが、while文は構文上で「普通はここで加減算をやる」という箇所がありませんので、実際に忘れてしまうものです。

// ここでiを宣言してしまうと、以後はiという変数を新しく宣言できない!!
int i = 0;

while (i < 5) {
	System.out.println(i);
	i++; // この++を忘れるのはプログラムミスのあるある、実際忘れがち!!
}

3-2.while文:繰り返し回数が決まっていない場合

繰り返しをする回数が事前に決まらず、何かの条件を満たすならずっと実行するようなものはwhile文が良いでしょう。この場合は、繰り返し実行する何かの処理の結果、それ自体が条件式として使えるものが適しています。

実際のプログラムで良く見られるのは以下のようなものです。

// ファイルを読むこむためにBufferedReaderを生成
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;

// BufferedReaderから1行ずつ読み込みながら…
while ((line = br.readLine()) != null) {  
	// 読み取った行を使って何かを処理する
}

パッと見で、何をしているのかわからないかもしれません。これはBufferedReaderから1行ずつ読み取って(readLine)、何か処理をするものです。readLineは最終行に達するとnullを戻すので、それを条件式での終了条件にしています。

読み込むべき行数は事前に分からないのですが、終わる条件は明確(readLinenullを戻す)、かつファイルには終わりが必ずあります。それを1つの条件式で変数への代入を含めてシンプルに表現できています。

for文でも似た感じで書けますが、この処理自体にカウンター変数やその管理が不要なので、for文の;;は余計に思えてしまいます。while文の方が、やりたいことの意図が良く伝わると思いませんか?


4.まとめ

while文は、条件式で決められた条件を満たす間、処理部をずっと実行し続ける繰り返し構文です。構文はシンプルなものですが、Javaの繰り返し処理ではなくてはならないものです。

while文とfor文は機能も似ていますが、プログラムの中で自然に使える箇所は少しだけ違います。その少しの違いがプログラムミスに繋がる可能性もありますので、違いには気を付けたいですね。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

公式アカウントLINE限定!ボールドの内定確率が分かる無料診断実施中
公式アカウントLINE限定!
ボールドの内定確率が分かる無料診断実施中