В Java как break взаимодействует с вложенными циклами? - PullRequest
38 голосов
/ 24 февраля 2011

Я знаю, что оператор break выпрыгивает из цикла, но выпрыгивает ли он из вложенных циклов или только из того, в котором он находится в данный момент?

Ответы [ 4 ]

81 голосов
/ 24 февраля 2011

Без каких-либо украшений, break просто вырвется из самой внутренней петли.Таким образом, в этом коде:

while (true) { // A
    while (true) { // B
         break;
    }
}

break только выходит из цикла B, поэтому код будет зацикливаться вечно.

Однако в Java есть функция, называемая «именованные разрывы» вкоторый вы можете назвать ваши петли, а затем указать, какой из них разорвать.Например:

A: while (true) {
    B: while (true) {
         break A;
    }
}

Этот код не будет зацикливаться вечно, потому что break явно оставляет цикл A.

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

В языках, отличных от Java, например, C и C ++, этот оператор «помеченный как разрыв» не существует, и вырваться из многократно вложенного цикла нелегко.Это можно сделать с помощью оператора goto, хотя обычно это не одобряется.Например, вот как может выглядеть вложенный разрыв в C, если вы готовы игнорировать совет Дейкстры и использовать goto:

while (true) {
    while (true) {
        goto done;
    }
}
done:
   // Rest of the code here.

Надеюсь, это поможет!

4 голосов
/ 24 февраля 2011

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

0 голосов
/ 16 июня 2016

это разрывает 1 петлю. очень просто. Например:

for loop
   for loop
      break;
   end for loop
end for loop

вырвался из внутреннего цикла, но все еще во внешнем цикле

0 голосов
/ 07 сентября 2013

Вы также можете выйти, используя исключения, так что вы можете справиться с несколькими причинами

 void fkt1() {
    try {
        while (true)
            fkt2();
    } catch (YourAbortException e) {
        e.printStackTrace();
    }

    //go on
}

void fkt2() {
    while (true)
        if (abort)
            throw new YourAbortException();
}
...