無限ループ
日本語 | 無限輪 |
英語 | infinite loop |
ふりがな | むげんるーぷ |
フリガナ | ムゲンループ |
決して止まらないループのこと。
「永久ループ」とも言う。
for、while、do-while等の繰り返し系ステートメントや、再帰呼び出し等、同じ処理を繰り返し行う「ループ」を止めるための条件が機能せず、処理を繰り返し続けることを「無限ループ」と言う。
無限ループとなった場合、強制終了する必要がある。ローカル変数やインスタンスを作成している場合にはOutOfMemoryErrorクラスやStackOverflowErrorクラスが投げられることで終了する場合もある。
ループの終了条件に誤りがあったり、ループの回数を数える変数(ループカウンター)の増え方に誤りがあったりする場合に発生することが多い。
「永久ループ」とも言う。
for、while、do-while等の繰り返し系ステートメントや、再帰呼び出し等、同じ処理を繰り返し行う「ループ」を止めるための条件が機能せず、処理を繰り返し続けることを「無限ループ」と言う。
無限ループとなった場合、強制終了する必要がある。ローカル変数やインスタンスを作成している場合にはOutOfMemoryErrorクラスやStackOverflowErrorクラスが投げられることで終了する場合もある。
ループの終了条件に誤りがあったり、ループの回数を数える変数(ループカウンター)の増え方に誤りがあったりする場合に発生することが多い。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 無限ループの例。
while( true )
{
System.out.println( "ループ中" );
// ループ中
// ループ中
// ループ中
// ループ中
// ...
// と、ループが止まりません。
// こうなったら強制終了する必要があります。
}
}
// ありがちな無限ループの例。
private static void example()
{
// 1.ループカウンターを増やし忘れる。
int i = 0;
while( i < 100 )
{
// ++i; // を書き忘れたり。
}
// 2.条件式を間違える。
for( int iF1 = 0; 0 <= iF1 || iF1 < 5; ++iF1 )
{
// 「0以上か5未満」なので、これだと常に「0以上」に
// 当てはまってしまうため無限ループになります。
}
// 3.ループカウンターを書き換える。
for( int iF1 = 0; iF1 < 5; ++iF1 )
{
iF1 = 0;
// これだと毎回0にリセットされてしまいます。
}
// 4.知らずに再帰呼び出ししてしまう。
methodA();
// methodA()メソッドとmethodB()メソッドはお互いに
// 呼び合っているので止まりません。
// ただ、ここまで分かりやすいことは少ないでしょう。
// 実際には「while( true ) の無限ループで、if(){ break; }で
// 抜けるつもりが、ミスがあって抜けない場合がある」といった
// 複雑で見つけにくいバグの方が多いと思いでしょう。
}
private static void methodA()
{
// methodB()を呼びます。
methodB();
}
private static void methodB()
{
// methodA()を呼びます。
methodA();
// ……と、永久に止まりません。
}
}
public class Sample
{
public static void main( String[] args )
{
// 無限ループの例。
while( true )
{
System.out.println( "ループ中" );
// ループ中
// ループ中
// ループ中
// ループ中
// ...
// と、ループが止まりません。
// こうなったら強制終了する必要があります。
}
}
// ありがちな無限ループの例。
private static void example()
{
// 1.ループカウンターを増やし忘れる。
int i = 0;
while( i < 100 )
{
// ++i; // を書き忘れたり。
}
// 2.条件式を間違える。
for( int iF1 = 0; 0 <= iF1 || iF1 < 5; ++iF1 )
{
// 「0以上か5未満」なので、これだと常に「0以上」に
// 当てはまってしまうため無限ループになります。
}
// 3.ループカウンターを書き換える。
for( int iF1 = 0; iF1 < 5; ++iF1 )
{
iF1 = 0;
// これだと毎回0にリセットされてしまいます。
}
// 4.知らずに再帰呼び出ししてしまう。
methodA();
// methodA()メソッドとmethodB()メソッドはお互いに
// 呼び合っているので止まりません。
// ただ、ここまで分かりやすいことは少ないでしょう。
// 実際には「while( true ) の無限ループで、if(){ break; }で
// 抜けるつもりが、ミスがあって抜けない場合がある」といった
// 複雑で見つけにくいバグの方が多いと思いでしょう。
}
private static void methodA()
{
// methodB()を呼びます。
methodB();
}
private static void methodB()
{
// methodA()を呼びます。
methodA();
// ……と、永久に止まりません。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // 無限ループの例。 while( true ) { System.out.println( "ループ中" ); // ループ中 // ループ中 // ループ中 // ループ中 // ... // と、ループが止まりません。 // こうなったら強制終了する必要があります。 } } // ありがちな無限ループの例。 private static void example() { // 1.ループカウンターを増やし忘れる。 int i = 0; while( i < 100 ) { // ++i; // を書き忘れたり。 } // 2.条件式を間違える。 for( int iF1 = 0; 0 <= iF1 || iF1 < 5; ++iF1 ) { // 「0以上か5未満」なので、これだと常に「0以上」に // 当てはまってしまうため無限ループになります。 } // 3.ループカウンターを書き換える。 for( int iF1 = 0; iF1 < 5; ++iF1 ) { iF1 = 0; // これだと毎回0にリセットされてしまいます。 } // 4.知らずに再帰呼び出ししてしまう。 methodA(); // methodA()メソッドとmethodB()メソッドはお互いに // 呼び合っているので止まりません。 // ただ、ここまで分かりやすいことは少ないでしょう。 // 実際には「while( true ) の無限ループで、if(){ break; }で // 抜けるつもりが、ミスがあって抜けない場合がある」といった // 複雑で見つけにくいバグの方が多いと思いでしょう。 } private static void methodA() { // methodB()を呼びます。 methodB(); } private static void methodB() { // methodA()を呼びます。 methodA(); // ……と、永久に止まりません。 } }