Недоступный оператор в цикле Java - PullRequest
0 голосов
/ 06 сентября 2011

При поиске темы «мертвый код» здесь предупреждение о мертвом коде в затмении

Я попробовал следующий простой код 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;
        }
    }
}    

и он прекрасно компилируется.

Есть ли причина, почему это прекрасно скомпилируется?

логически оба должны вызывать бесконечный цикл и оба должны вызывать ошибку времени компиляции.

Я что-то не так делаю?

Ответы [ 6 ]

8 голосов
/ 06 сентября 2011

логически оба должны вызывать бесконечный цикл

Не совсем: while(false) никогда не входит в цикл.

Кроме того, компилятор не предупреждает о бесконечных циклах - вам может понадобиться один:

while(true) {
    // poll some queue for work
    // if work found do it
    // else sleep 1 second
}
5 голосов
/ 06 сентября 2011

Есть ли причина, по которой этот файл компилируется нормально?

Почему он не должен компилироваться нормально?Все операторы достижимы, в отличие от первого примера: -)

Многие программы намеренно имеют бесконечные циклы.(Например, сервер, который должен обслуживать клиентов «навсегда».) Не имеет смысла отказываться от компиляции бесконечных циклов.

логически оба должны вызыватьбесконечный цикл и оба должны вызывать ошибку времени компиляции.

Нет, только второй должен приводить к бесконечному циклу.

A 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; будет недоступен.

0 голосов
/ 06 сентября 2011

while(false) никогда не входите в цикл, поэтому некоторый код не может быть достигнут, и поэтому вы получили ошибку времени компиляции.

while(true) приводит к тому, что ваш пример приводит к бесконечности, поэтому вы можете захотеть получитьошибка времени компиляции.Тем не менее, вы можете иметь break в цикле, выходя из него и делая его легальным!Или вы можете также захотеть использовать бесконечные циклы в некоторых случаях (например, для демонов).Вот почему у вас нет ошибок в этом случае.

0 голосов
/ 06 сентября 2011

while(false) никогда не войдет в этот цикл.поэтому x=4; недоступен.while(true) снова бесконечный цикл.

0 голосов
/ 06 сентября 2011
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 */ }
0 голосов
/ 06 сентября 2011

Как правило, компилятор не будет предупреждать вас о бесконечных циклах, поскольку они не обязательно являются ошибкой программирования.

Кроме того, математически невозможно дать такое сообщение об ошибке надежно для всего кода. С математической точки зрения невозможно написать алгоритм, который докажет любой программе, будет ли она завершена или попадет в бесконечный цикл. Посмотрите «Проблема остановки», если хотите узнать подробности.

...