Как в Java break взаимодействует с вложенными циклами?

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


person Craig    schedule 23.02.2011    source источник


Ответы (4)


Без каких-либо украшений 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.

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

person templatetypedef    schedule 23.02.2011
comment
Хороший ответ. Однако, если вы обнаружите, что прибегаете к именованным перерывам, вы, вполне возможно, делаете это неправильно. :-) - person Haakon; 24.02.2011
comment
Пожалуйста, ради людей, просматривающих ваш код, не используйте именованные разрывы! - person Tazzy531; 24.02.2011
comment
Именованные перерывы не так уж плохи, есть ситуации, когда они являются лучшим выбором. Однако использовать их чаще, чем два раза в год, странно. - person maaartinus; 24.02.2011
comment
Нет ничего плохого в именованных разрывах, особенно если альтернативой являются несколько управляющих переменных и запутанная условная логика. - person DJClayworth; 24.02.2011

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

person biziclop    schedule 23.02.2011

Вы также можете вырваться с помощью исключений, чтобы вы могли обрабатывать несколько причин.

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

    //go on
}

void fkt2() {
    while (true)
        if (abort)
            throw new YourAbortException();
}
person Marian Klühspies    schedule 07.09.2013
comment
да, но имейте в виду, что нельзя использовать исключения для реализации логики - person Vetras; 26.10.2015

разрывается 1 петля. очень простой. например:

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

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

person minh nguyen    schedule 16.06.2016