Посмотрите на следующий бесконечный цикл while
в Java. Это приводит к ошибке времени компиляции для инструкции ниже.
while(true) {
System.out.println("inside while");
}
System.out.println("while terminated"); //Unreachable statement - compiler-error.
Следующий такой же бесконечный цикл while
, однако работает отлично и не вызывает никаких ошибок, в которых я только что заменил условие с помощью логической переменной.
boolean b=true;
while(b) {
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
Во втором случае утверждение после цикла очевидно недостижимо, потому что логическая переменная b
истинна, но компилятор вообще не жалуется. Почему?
Изменить: Следующая версия while
попадает в бесконечный цикл как очевидный, но не вызывает ошибок компилятора для инструкции ниже, хотя условие if
в цикле всегда false
и, следовательно, цикл никогда не может вернуться и может быть определен компилятором во время самого компиляции.
while(true) {
if(false) {
break;
}
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
while(true) {
if(false) { //if true then also
return; //Replacing return with break fixes the following error.
}
System.out.println("inside while");
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
while(true) {
if(true) {
System.out.println("inside if");
return;
}
System.out.println("inside while"); //No error here.
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
Изменить: То же самое с if
и while
.
if(false) {
System.out.println("inside if"); //No error here.
}
while(false) {
System.out.println("inside while");
// Compiler complain - unreachable statement.
}
while(true) {
if(true) {
System.out.println("inside if");
break;
}
System.out.println("inside while"); //No error here.
}
Следующая версия while
также застревает в бесконечном цикле.
while(true) {
try {
System.out.println("inside while");
return; //Replacing return with break makes no difference here.
} finally {
continue;
}
}
Это связано с тем, что блок finally
всегда выполняется, даже если оператор return
встречается перед ним внутри самого блока try
.