【问题标题】:Unreachable statement in java while loopjava while循环中无法访问的语句
【发布时间】:2011-09-06 21:00:27
【问题描述】:

在这里查找“死代码”线程时 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;
        }
    }
}    

它编译得很好。

有什么原因,为什么编译得很好?

从逻辑上讲,两者都应该导致无限循环,并且都应该导致编译时错误。

我做错了吗?

【问题讨论】:

  • “稍微调整了代码”到完美的程度!
  • 感谢大家的回答。我认为 while(false) 会导致无限循环是不正确的。非常感谢@S.L.Barth 对这个问题的数学观点。
  • 人们在没有评论的情况下投反对票是很糟糕的:-(

标签: java dead-code


【解决方案1】:

从逻辑上讲,两者都应该导致无限循环

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

此外,编译器不会警告无限循环 - 你可能真的想要一个:

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

【讨论】:

    【解决方案2】:

    有什么原因,为什么编译得很好?

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

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

    从逻辑上讲,两者都应该导致无限循环,并且都应该导致编译时错误。

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

    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; 将无法访问。

    【讨论】:

      【解决方案3】:
      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 为真

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

            一般来说,编译器不会就无限循环发出警告,因为它们不一定是编程错误。

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

            【讨论】:

              猜你喜欢
              • 2012-12-09
              • 1970-01-01
              • 1970-01-01
              • 2021-05-12
              • 2016-10-22
              • 1970-01-01
              • 2020-03-08
              • 2018-05-27
              • 2013-03-26
              相关资源
              最近更新 更多