1. ホーム
  2. java

[解決済み] Javaでの無限ループ

2023-06-25 06:56:47

質問

次の無限大を見よ。 while ループを見てください。これは、その下のステートメントに対してコンパイルタイムエラーを引き起こします。

while(true) {
    System.out.println("inside while");
}

System.out.println("while terminated"); //Unreachable statement - compiler-error.


次の同じ無限 while ループは、しかし、私はちょうど条件をブール変数に置き換えることで、正常に動作し、何のエラーも発生しません。

boolean b=true;

while(b) {
    System.out.println("inside while");
}

System.out.println("while terminated"); //No error here.


2番目のケースでも、ループの後のステートメントは明らかに到達不可能で、ブーリアン変数 b が真であるにもかかわらず、コンパイラはまったく文句を言いません。なぜでしょうか?


編集する。 以下のバージョンの while は明らかに無限ループに陥りますが、その下のステートメントでは if ループの中の条件は常に false であり、その結果、ループは決して戻ることができず、コンパイル時にコンパイラによって決定されることができます。

while(true) {

    if(false) {
        break;
    }

    System.out.println("inside while");
}

System.out.println("while terminated"); //No error here.


while(true) {

    if(false)  { //if true then also
        return;  //Replacing return with break fixes the following error.
    }

    System.out.println("inside while");
}

System.out.println("while terminated"); //Compiler-error - unreachable statement.


while(true) {

    if(true) {
        System.out.println("inside if");
        return;
    }

    System.out.println("inside while"); //No error here.
}

System.out.println("while terminated"); //Compiler-error - unreachable statement.


編集する。 同じことを ifwhile .

if(false) {
    System.out.println("inside if"); //No error here.
}


while(false) {
    System.out.println("inside while");
    // Compiler's complain - unreachable statement.
}


while(true) {

    if(true) {
        System.out.println("inside if");
        break;
    }

    System.out.println("inside while"); //No error here.
}      


以下のバージョンの while も無限ループに陥ってしまいます。

while(true) {

    try {
        System.out.println("inside while");
        return;   //Replacing return with break makes no difference here.
    } finally {
        continue;
    }
}

これは finally ブロックは常に実行されるからです。 return 文がその前にあっても try ブロック自体の中で

どのように解決するのですか?

コンパイラは、簡単かつ明確に、最初の式 は常に が無限ループになることを証明できますが、2番目の式はそう簡単ではありません。おもちゃのような例では簡単ですが、もしそうならどうでしょう。

  • 変数のコンテンツがファイルから読み込まれた場合?
  • 変数はローカルではなく、他のスレッドによって変更される可能性がありますか?
  • 変数はユーザーの入力に依存していましたか?

コンパイラは明らかにあなたのような単純なケースをチェックしていません。なぜでしょうか?なぜならそれは はるかに難しい であり、仕様で禁止されているからです。参照 セクション14.21 :

(ちなみに、私のコンパイラ という変数が宣言されていると文句を言います。 final .)