Бесконечные циклы в Java
Посмотрите на следующее бесконечное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's 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
заблокировать себя.