java while循环中的无法访问的语句

时间:2011-09-06 12:15:17

标签: java dead-code

虽然在这里找到了“死代码”线程 dead code warning in 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;
        }
    }
}    

它编译得很好。

有没有理由,为什么编译好?

逻辑上两者都应该导致infiniteloop,并且都会导致编译时错误。

我做错了吗?

6 个答案:

答案 0 :(得分:8)

  

逻辑上两者都应该导致infiniteloop

不完全:while(false)永远不会进入循环。

此外,编译器不会警告无限循环 - 您可能实际上需要一个:

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

答案 1 :(得分:5)

  

有没有理由,为什么编译好?

为什么不编译好?与第一个示例相反,所有语句均可访问: - )

许多程序故意有无限循环。 (例如,考虑一个服务器,应该“永远”为客户服务。)拒绝编译无限循环是没有意义的。

  逻辑上,

都会导致无限循环,并且都会导致编译时错误。

不,只有第二个应该导致无限循环。

只要条件为真,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;将无法访问。

答案 2 :(得分:0)

通常,编译器不会警告您无限循环,因为它们不一定是编程错误。

此外,在数学上不可能为所有代码可靠地提供这样的错误消息。编写一种能够证明任何程序是否会终止或陷入无限循环的算法是不可能的。如果您想了解详细信息,请查看“暂停问题”。

答案 3 :(得分: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 */ }

因为虽然(condition)期望condition为真

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

答案 4 :(得分:0)

while(false)永远不会进入此循环。所以x=4;无法访问。 while(true)又是一个无限循环。

答案 5 :(得分:0)

while(false)永远不会进入循环,因此无法访问某些代码,这就是编译时错误的原因。

while(true)会导致您的示例结果无限,因此您可能希望出现编译时错误。尽管如此,你可能会在循环中退出break并使其合法化!或者在某些情况下你可能也想要实际的无限循环(例如对于守护进程)。这就是为什么你在这种情况下没有错误。