2015-01-08 2 views
2

Зачем возникают следующие ошибки?Какая ошибка в цикле 'for'?

for(; 0 ;)  System.out.println("guess"); // or 
for(;false;)  System.out.println("guess"); // or 
for(; 1 ;)  System.out.println("guess"); 

Но следующие работает нормально (бесконечно):

for(;true;)  System.out.println("guess"); 

Почему это работает для true, но не для false?

+0

'; true;' всегда истинно и является допустимым условием. 'false' никогда не будет правдой, так что это неверно. Остальные довольно понятны. –

+0

'' for (;;) '' работает как бесконечный цикл, тоже – timbru31

+0

@AliAkber Я бы рекомендовал читать на for-loops (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for .html). Как сказано в нем: 'Когда выражение завершения вычисляется как false, цикл завершается' Таким образом, ваш цикл даже не будет выполнен, потому что он уже завершен. – Ascalonian

ответ

8

условие (то есть бит между ; с) должно быть логическое значение, так это сразу исключает первый и третий варианты в первом фрагменте.

Теперь второй вариант, в котором вы имеют используется логическое значение, не компилируется, поскольку компилятор понимает, что петля никогда не будет введен и, следовательно, выдает ошибку:

 
Untitled.java:3: error: unreachable statement 
     for(;false;)  System.out.println("guess"); 
         ^
1 error 

следует отметить, что мандаты JLS, что ошибки будут выпущены для недостижимого заявления (см §14.21):

It is a compile-time error if a statement cannot be executed because it is unreachable.

...

The contained statement is reachable iff the for statement is reachable and the condition expression is not a constant expression whose value is false .

+1

Разве это не предупреждение? Будет намного легче для отладки, если бы это было .. – Maroun

+2

@MarounMaroun Это спорно. Я бы, наверное, сделал это предупреждение, если бы я разрабатывал компилятор, но я уверен, что есть случай, чтобы сделать его ошибкой. – arshajii

+0

Является '; false,' ошибкой в ​​Java? Просто протестирован на C#, и он компилируется отлично, но он предостерегает, что код внутри недостижим (что очевидно). –

1

Java требует логического значения, как секо nd в заголовке цикла, он вычисляет оператор и если оператор возвращает true, jvm будет запускать код тела цикла, а тело не будет пропущено.

0 и 1, очевидно, не являются булевыми, и они не определяют оператор, который можно было бы оценить (например, x < y), и поскольку java является статическим и сильным типизированным языком (в отличие от Python или Perl), он не может использовать int для boolean, поэтому он падает.

Редактирование: Если вы предоставите инструкцию «false» как JVM, заметите, что тело цикла никогда не может быть достигнуто, это вызовет ошибку времени выполнения.

0

В отличие от C, в Java, true и false соответствуют boolean значениям типа, где 1 и 0 в int (на самом деле, в C нет boolean декларативного типа, и логические проверки осуществляются на основе целочисленных сравнений. В Java , все ясно).

Смежные вопросы