Бесконечные циклы в 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(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(true) {

    try {
        System.out.println("inside while");
        return;   //Replacing return with break makes no difference here.
    } finally {
        continue;
    }
}

Это связано с тем, что блок finally всегда выполняется, даже если оператор return встречается до него в самом блоке try .

82
задан Tiny 11 October 2014 в 17:50
поделиться