繁体   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