無限ループ
Infinite Loop
概要(サマリー)
プログラムが終わる条件を満たせず、同じ処理を止まらず繰り返し続けてしまう状態のこと。
本来なら何回か繰り返したら終わるはずの処理が、終了条件のミスや更新漏れによって、延々と回り続けてしまう。
その結果、ブラウザが固まる、CPU使用率が上がる、画面が反応しない、サーバー処理が終わらない、といった問題が起きることがある。
AIに作ってもらったコードでも、条件分岐や繰り返し処理の設計がずれていると無限ループになることがある。
そのため、画面がずっと読み込み中のまま、ボタンを押すと固まる、処理が終わらない、といったときは無限ループを疑う価値がある。
詳細解説
無限ループ(Infinite Loop)とは、プログラムの繰り返し処理が終わる条件に到達せず、止めない限り同じ処理を続けてしまう状態のことである。
名前の通り、終わるはずのループが終わらなくなる不具合であり、典型的なバグの1つである。
プログラムでは、同じ処理を何回も行うために「ループ処理」を使うことが多い。
たとえば、
- 商品一覧を順番に表示する
- 配列の中身を1件ずつ処理する
- 一定条件になるまで繰り返す
といった場面である。
本来は、どこかで「ここで終わる」という条件があり、そこでループは止まる。
しかし、その条件が間違っていたり、条件に近づくための値が更新されなかったりすると、処理が永遠に続いてしまう。
これが無限ループである。
なぜ無限ループが起きるのか
無限ループが起きる原因は、主に次のようなものが多い。
1. 終了条件が間違っている
本来は10回で終わるはずなのに、条件式がずれていて終わらない。
2. ループを進める値が更新されていない
カウンターを増やす処理を書き忘れていて、ずっと同じ状態のままになる。
3. 条件が永遠に真のまま
while (true) のような状態を意図せず作ってしまう。
while (true) 自体は、監視処理やゲームループなどで意図して使われることもあるが、抜け道や停止条件がない場合に問題になる。
4. 再帰処理が止まらない
関数が自分自身を呼び続け、終了条件に達しない。
つまり無限ループは、
「終わるはずの仕組みが壊れている」
ことで起きる。
どんなイメージで考えればよいか
初心者向けには、次のようなたとえがわかりやすい。
終わりのない階段
階段を上っていけばいつかゴールに着くはずなのに、同じ場所をぐるぐる回る構造になっていて永遠に終わらない。
自動ドアが開閉を繰り返す
閉まる条件がうまく働かず、ずっと開いたり閉じたりを繰り返している状態。
「もう一回」と言い続ける機械
「終わったらやめる」ではなく、「まだ終わっていない」と誤判定し続けるので、いつまでも止まらない。
どんな症状が出るのか
無限ループが起きると、環境によってさまざまな症状が出る。
- ブラウザが固まる
- ページの読み込みが終わらない
- CPU使用率が急に高くなる
- サーバー処理が返ってこない
- メモリ使用量が増え続ける
- 画面がフリーズしたように見える
- ターミナルで処理が終わらない
初心者にとって分かりやすいのは、
「何かをした直後に、急に反応がなくなる」
という症状であることが多い。
ループ処理自体は悪いものではない
ここは大事な点である。
無限ループはバグだが、ループ処理そのものはプログラミングで非常によく使われる普通の仕組みである。
たとえば、
- 配列を順番に処理する
- 一覧を表示する
- 条件を満たすまで繰り返す
といったことは正常なループ処理である。
問題なのは、ループを使うことではなく、
終わる条件が正しく設計されていないこと
である。
具体的な例
たとえば次のようなコードがある。
let i = 0;
while (i < 5) {
console.log(i);
}
このコードでは、本来 i を増やしていく必要がある。
しかし i++ のような更新がないため、i はずっと 0 のままである。
その結果、i < 5 は永遠に真のままとなり、無限ループになる。
正しくは、たとえばこうである。
let i = 0;
while (i < 5) {
console.log(i);
i++;
}
このように、条件に近づくための変化が必要である。
for文でも起きる
無限ループは while だけでなく、for でも起きることがある。
たとえば、
for (let i = 0; i < 10; ) {
console.log(i);
}
この場合も、i を増やしていないため、終わらなくなる可能性がある。
つまり、見た目が for だから安全というわけではない。
再帰による無限ループ
無限ループは、繰り返し構文だけでなく再帰でも起きることがある。
再帰とは、関数が自分自身を呼ぶ仕組みである。
たとえば、終了条件なしに自分自身を呼び続けると、無限に処理が続いてしまう。
この場合はループというより「無限再帰」に近いが、初心者向けには広い意味で同じような危険として理解してよい。
フロントエンドで起きる無限ループ
フロントエンドでは、たとえば次のようなところで無限ループが起きやすい。
- イベント処理の中で自分自身を呼び続ける
- 描画更新が更新を再び呼ぶ
- 状態変更が再レンダリングを繰り返す
setIntervalや監視処理を止め忘れて動き続ける
この場合、ブラウザが固まりやすく、見た目としては「フリーズした」と感じやすい。
バックエンドで起きる無限ループ
バックエンドでも無限ループは起きる。
たとえば、
- 条件ミスで処理が返ってこない
- キュー処理が同じ仕事を永遠に回す
- API待ちの条件が壊れている
- データを取りに行く処理が止まらない
といったことがある。
この場合は画面が固まるというより、
- APIレスポンスが返らない
- タイムアウトする
- サーバー負荷が異常に上がる
といった症状になりやすい。
無限ループを防ぐには
無限ループを防ぐためには、次のようなことが重要である。
1. 終了条件をはっきりさせる
「何を満たしたら終わるのか」を明確にする。
2. 条件に近づく更新を書く
カウンターや状態がちゃんと進むようにする。
3. 異常時の保険を考える
本来終わるはずでも、回数制限などを入れておくと安全な場合がある。
4. 小さいデータで試す
いきなり大きなループを回さず、まず少数で確認する。
5. ログを入れる
どこまで進んでいるかを見ると、止まっている場所を把握しやすい。
デバッグの考え方
無限ループを疑ったときは、デバッグ の基本が大切である。
たとえば、
- どの処理をした直後に固まるか
- ループ変数が更新されているか
- 条件が本当に変化しているか
- ログがどこまで出ているか
を確認する。
とくに console.log() やログ出力で、
- ループ回数
- 現在の値
- 条件判定の結果
を見ると、かなり原因を絞りやすい。
ただし、無限ループ内でログを大量に出すと、ブラウザやターミナルがさらに重くなることがある。回数制限を入れるなど、ログを出しすぎない工夫も大切である。
より詳しくAIに聞いてみよう
- 無限ループとは何かを、中学生でもわかるように説明してください。
while文で無限ループが起きる典型例を教えてください。for文や再帰でも無限ループが起きる理由を説明してください。- ブラウザが固まったとき、無限ループかどうか切り分ける方法を教えてください。
- AIが書いたコードに無限ループがないか確認するときのチェックポイントを教えてください。