簡體   English   中英

Java While循環中無法訪問的語句

[英]Unreachable statement in java while loop

在這里查找“死代碼”線程時, 在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;
        }
    }
}    

編譯就可以了

是否有原因,為什么這樣編譯正常?

從邏輯上講,兩者都應引起無限循環,並且都應引起編譯時錯誤。

難道我做錯了什么?

從邏輯上講,兩者都應引起無限循環

不完全是: while(false)永遠不會進入循環。

另外,編譯器不會警告無限循環-您實際上可能想要一個:

while(true) {
    // poll some queue for work
    // if work found do it
    // else sleep 1 second
}

是否有原因,為什么這樣編譯正常?

為什么它不能編譯正常? 與第一個示例相反,所有語句都是可訪問的:-)

許多程序故意有無限循環。 (例如,考慮一台應該“永遠”為客戶服務的服務器。)拒絕編譯無限循環是沒有道理的。

從邏輯上講,兩者都應導致無限循環,並且都應引起編譯時錯誤。

不,只有第二個循環會導致無限循環。

只要條件為真,就會進行while循環。 由於false永遠不會為真,因此循環體將永遠不會執行(這就是x = 4;在這種情況下不可訪問的原因)。


請注意,如果您這樣做...

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

...它不會編譯,因為循環將永遠持續下去,最后一個x = 4; 將無法到達。

通常,編譯器不會警告您無限循環,因為它們不一定是編程錯誤。

而且,從數學上講不可能對所有代碼都可靠地給出這樣的錯誤消息。 從數學上講,不可能編寫一種算法來證明任何程序是否終止或陷入無限循環。 如果您想了解詳細信息,請查找“停止問題”。

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( condition )期望condition為true

while(true){ /* this will cause infinite loop */ }

while(false)將永遠不會進入此循環。 所以x=4; 是無法到達的。 while(true)再次是一個無限循環。

while(false)永遠不會進入循環,因此無法訪問某些代碼,這就是為什么出現編譯時錯誤的原因。

while(true)在您的示例中導致無限,因此您可能需要編譯時錯誤。 但是,您可能會在退出循環並使之合法化方面有所break 或者,在某些情況下(例如,對於守護程序),您可能還需要實際的無限循環。 這就是在這種情況下您沒有錯誤的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM