javaのwhileとは?Javaの繰り返しの基本while文・for文との使い分けを解説
while文はJavaで繰り返しをするための構文の一つです。
何かの条件を満たしている間、ずっと処理を繰り返し続けるものです。
while文はfor文よりシンプルな構文ですので、コツが分かればすぐ使えます。
この記事は初心者向けに記述していますので、ぜひ学んで行ってください。
ここで覚えれば、他のプログラミング言語でも同じように使えますよ。
なお、慣れないうちは、同じような繰り返し構文であるfor文と、使い分けに迷うことが多いものです。
その考え方の例も記述しましたので、ぜひ参考にしてください!
※この記事のサンプルは、Java 10の環境で動作確認しています。
目次
1.while文の基本
1-1.while文は条件式と処理部の繰り返し
while文は「①条件式」と「②処理部」の二つからなります。
while (①条件式) { ②処理部 }
while文は必ず①の条件式から始まります。条件式は、実行した結果が必ずbooleanにならなければなりません。booleanでなければコンパイルエラーです。これがJavaのwhileにおける大きな特徴です。
この条件式の結果がtrueの場合にだけ、②の処理部が実行されます。falseの場合はwhile文が終了し、while文の次にある処理に移ります。
処理部での処理が「{}」でくくられた最後まで行くと、また①の条件式が実行されます。あるいは、後述するcontinueやbreakが実行されても処理部は終了します。
このように、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++
- 0 < 2 → trueなので処理部が実行される
- iの値を出力した後、0 が +1 されて 1 になる
- 1 < 2 → trueなので処理部が実行される
- iの値を出力した後、1 が +1 されて 2 になる
- 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を戻すので、それを条件式での終了条件にしています。
読み込むべき行数は事前に分からないのですが、終わる条件は明確(readLineがnullを戻す)、かつファイルには終わりが必ずあります。それを1つの条件式で変数への代入を含めてシンプルに表現できています。
for文でも似た感じで書けますが、この処理自体にカウンター変数やその管理が不要なので、for文の;;は余計に思えてしまいます。while文の方が、やりたいことの意図が良く伝わると思いませんか?
4.まとめ
while文は、条件式で決められた条件を満たす間、処理部をずっと実行し続ける繰り返し構文です。構文はシンプルなものですが、Javaの繰り返し処理ではなくてはならないものです。
while文とfor文は機能も似ていますが、プログラムの中で自然に使える箇所は少しだけ違います。その少しの違いがプログラムミスに繋がる可能性もありますので、違いには気を付けたいですね。
コメント