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

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

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

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

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

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

只要条件为真,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( 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 回答