こんにちは、かつコーチです。
同じ処理を何度も書くのは非効率です。
Javaには繰り返し処理(同じ処理を条件に応じて何度も実行する構文)として、for文・while文・拡張for文の3種類が用意されています。
この記事では、それぞれの使い分けと、初心者がよくハマる無限ループの対処法を解説します。
繰り返し処理とは?
for文・while文の役割の違い
- for文:繰り返す回数があらかじめ決まっている場合に向いている
- while文:繰り返す回数が決まっておらず、条件を満たす間だけ繰り返したい場合に向いている
- 拡張for文(for-each):配列やコレクションの要素を先頭から順に取り出す場合に向いている
「何回繰り返すか」が分かっているかどうかで使い分けるのが基本方針です。
なぜ繰り返し処理が重要なのか
繰り返し処理はプログラムの根幹です。
リストの集計、ファイルの1行ずつの読み込み、条件を満たすまでの再試行など、実務のあらゆる場面で使われます。
最初にこの構文をしっかり押さえておくと、後のコレクション操作の理解もスムーズになります。
基本の書き方:for文
基本のfor文構文
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("カウント: " + i);
}
}
}
for文は「初期化; 継続条件; 更新処理」の3つをセミコロン区切りで書きます。i < 5がtrueである間だけループが継続し、各ループの最後にi++が実行されます。
拡張for文で配列を走査する
int[] scores = {80, 90, 70};
for (int score : scores) {
System.out.println(score);
}
拡張for文は「インデックスの管理を意識せずに全要素を処理したい」ときに便利です。
ただしインデックス番号自体が必要な場合(先頭要素だけ特別扱いしたい等)は、通常のfor文を使う必要があります。
基本の書き方:while文
while文とdo-while文
int count = 0;
while (count < 3) {
System.out.println("while: " + count);
count++;
}
int retry = 0;
do {
System.out.println("do-while: " + retry);
retry++;
} while (retry < 3);
whileは条件を先にチェックしてから処理を実行するため、条件が最初からfalseなら一度も実行されません。
一方do-whileは先に処理を1回実行してから条件をチェックするため、最低1回は必ず実行したい処理(ユーザー入力の再確認など)に向いています。
よくあるつまずきポイント・エラー対処
無限ループでハマった一次情報
私が初心者の頃、以下のようなコードを書いてIntelliJが固まったように感じたことがあります。
❌ Before
int i = 0;
while (i < 10) {
System.out.println(i);
// i++ を書き忘れている
}
iを更新する処理を書き忘れたため、iは永遠に0のままとなり、条件i < 10が常にtrueのまま処理が終わらなくなりました。
コンソールに0が延々と出力され続け、実行を強制終了(IntelliJの停止ボタン、またはターミナルでCtrl+C)するまで止まりませんでした。
✅ After
int i = 0;
while (i < 10) {
System.out.println(i);
i++; // 更新処理を忘れない
}
for文は初期化・条件・更新処理が1行にまとまっているため書き忘れにくいですが、while文は更新処理を自分でブロックの中に書く必要があるため、意識的にチェックする習慣をつけましょう。
配列の範囲外アクセスによる例外
❌ Before
int[] numbers = {1, 2, 3};
for (int i = 0; i <= numbers.length; i++) {
System.out.println(numbers[i]);
}
このコードを実行すると、java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3という例外(実行中に発生したエラーを表すオブジェクト)が発生します。
配列の添字は0からlength - 1までなので、<=ではなく<にする必要があります。
✅ After
int[] numbers = {1, 2, 3};
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
<=と<の1文字の違いですが、実務でも頻出するミスなので、for文を書いたら継続条件を必ず読み返す癖をつけると安心です。
応用・一歩先の使い方
breakとcontinueでループ制御を細かく調整する
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // ループ自体を抜ける
}
if (i % 2 == 0) {
continue; // 今回のループだけスキップして次へ
}
System.out.println(i);
}
breakはループ全体を終了させ、continueは今回のループ処理だけをスキップして次のループに進みます。
この2つを組み合わせることで、「特定の条件が来たら即終了」「特定の条件だけスキップ」といった柔軟な制御ができます。
まとめ
この記事のポイント
- 回数が決まっているならfor文、条件次第ならwhile文、配列やコレクションの走査は拡張for文が向いている
- do-while文は最低1回は処理を実行したい場合に使う
- while文は更新処理の書き忘れによる無限ループに注意する
- 配列の添字は
0からlength - 1までで、境界条件のミスはArrayIndexOutOfBoundsExceptionを引き起こす
次に読むべき記事
- if文・switch文で条件分岐
- 配列の基本:宣言・初期化・要素アクセス
タグ: Java, 初心者向け, 基本文法