0

ここで「デッドコード」スレッドを検索しているとき に、Eclipseでデッドコードの警告が表示されます

次の簡単な Java コードを試しました。

public class Test2
{
    public static void main(String[] args)
    {
        int x = 0;        
        while(false)
        {                        
            x=4;
        }
    }
}  

コンパイル時エラーを正しくスローします

C:\Documents and Settings\user\Desktop\Test2.java:7: unreachable
statement
        {                        
        ^ 1 error

私はこれにコードを微調整しました:

public class Test2
{
    public static void main(String[] args)
    {
        int x =0;        
        while(true)
        {                        
            x=4;
        }
    }
}    

そしてそれはうまくコンパイルされます。

これがうまくコンパイルされる理由はありますか?

論理的には、どちらも無限ループを引き起こし、両方ともコンパイル時エラーを引き起こすはずです。

私は何か間違ったことをしていますか?

4

6 に答える 6

8

論理的には両方とも無限ループを引き起こすはずです

完全ではありません:while(false)ループに入ることはありません。

また、コンパイラは無限ループについて警告しません。実際に必要になる場合があります。

while(true) {
    // poll some queue for work
    // if work found do it
    // else sleep 1 second
}
于 2011-09-06T12:17:11.933 に答える
5

これがうまくコンパイルされる理由はありますか?

うまくコンパイルできないのはなぜですか?最初の例とは対照的に、すべてのステートメントに到達可能です:-)

多くのプログラムは意図的に無限ループを持っています。(たとえば、「永久に」クライアントにサービスを提供する必要があるサーバーを考えてみてください。) 無限ループのコンパイルを拒否するのは意味がありません。

論理的には、どちらも無限ループを引き起こし、両方ともコンパイル時エラーを引き起こすはずです。

いいえ、2 つ目だけが無限ループになるはずです。

条件が true である限り、whileループが続きます。が真になることはないため、ループ本体が実行されることはありません (これが、その場合に に到達できない理由です)。falsex = 4;


その場合は注意してください...

public class Test2
{
    public static void main(String[] args)
    {
        int x =0;        
        while(true)
        {                        
            x=4;
        }
        x = 4;     <--------- unreachable!
    }
}    

x = 4;...ループは永遠に続き、最後に到達できないため、コンパイルされません。

于 2011-09-06T12:17:33.667 に答える
0

通常、無限ループは必ずしもプログラミングのミスではないため、コンパイラは無限ループについて警告しません。

また、すべてのコードに対してこのようなエラー メッセージを確実に表示することは数学的に不可能です。プログラムが終了するかどうか、または無限ループに陥るかどうかを証明するアルゴリズムを作成することは、数学的に不可能です。詳細を知りたい場合は「停止問題」を調べてください。

于 2011-09-06T12:18:24.857 に答える
0
C:\Documents and Settings\user\Desktop\Test2.java:7: unreachable statement {
^ 1 error

意味、there is a code which will be never executed

while(false){ /* this place will be never reached */ }

while( ) はtrue をcondition期待するためcondition

while(true){ /* this will cause infinite loop */ }
于 2011-09-06T12:18:26.333 に答える
0

while(false) このループに入ることはありません。到達不能ですx=4;while(true)再び無限ループです。

于 2011-09-06T12:20:00.120 に答える
0

while(false)ループに入らないので、一部のコードに到達できず、コンパイル時エラーが発生したのはそのためです。

while(true)例の結果は無限になるため、コンパイル時エラーが発生する場合があります。それにもかかわらず、それをbreak終了して合法にするループにいる可能性があります! または、場合によっては実際の無限ループも必要になる場合があります (たとえば、デーモンの場合)。そのため、この場合はエラーが発生しません。

于 2011-09-06T12:20:58.037 に答える