Разница между перерывом и продолжением выписки - PullRequest
235 голосов
/ 20 января 2009

Может кто-нибудь сказать мне разницу между break и continue утверждениями?

Ответы [ 21 ]

479 голосов
/ 20 января 2009

break выходит из цикла, continue переходит на следующую итерацию.

96 голосов
/ 20 января 2009

См. Заявления о ветвлении для более подробной информации и примеров кода:

break

Оператор break имеет две формы: помеченный и немаркированный. Вы видели немаркированная форма в предыдущем обсуждении оператора switch. Вы может также использовать немаркированный перерыв, чтобы прекратить действие for, while или do-while цикл [...]

Оператор без метки завершает работу самого внутреннего переключателя, поскольку while или do-while, но помеченный разрыв завершает внешний утверждение.

continue

Оператор continue пропускает текущую итерацию a, в то время как, или цикл «пока». Немеченая форма пропускает до конца самого внутреннего тело цикла и вычисляет логическое выражение, которое контролирует петля. [...]

Оператор с меткой continue пропускает текущую итерацию внешнего цикла, помеченного данной меткой.

61 голосов
/ 22 мая 2012
System.out.println ("starting loop:");
for (int n = 0; n < 7; ++n)
{
    System.out.println ("in loop: " + n);
    if (n == 2) {
        continue;
    }
    System.out.println ("   survived first guard");
    if (n == 4) {
        break;
    }
    System.out.println ("   survived second guard");
    // continue at head of loop
}
// break out of loop
System.out.println ("end of loop or exit via break");

Это приведет к следующему выводу:

starting loop:
in loop: 0
    survived first guard
    survived second guard
in loop: 1
    survived first guard
    survived second guard
in loop: 2
in loop: 3
    survived first guard
    survived second guard
in loop: 4
    survived first guard
end of loop or exit via break

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

first:
for (int i = 0; i < 4; ++i) 
{
    second:
    for (int j = 0; j < 4; ++j) 
    {
        third:
        for (int k = 0; k < 4; ++k) 
        {
            System.out.println ("inner start: i+j+k " + (i + j + k));
            if (i + j + k == 5)
                continue third;
            if (i + j + k == 7)
                continue second;
            if (i + j + k == 8)
                break second;
            if (i + j + k == 9)
                break first;
            System.out.println ("inner stop:  i+j+k " + (i + j + k));
        }
    }       
}

Поскольку это возможно, это не значит, что вы должны его использовать.

Если вы хотите смешным образом запутать свой код, вы выбираете не значимое имя, а http: и сопровождаете его комментарием, который выглядит чуждо, как веб-адрес в исходном коде:

http://stackoverflow.com/questions/462373
for (int i = 0; i < 4; ++i) 
{
     if (i == 2) 
         break http;

Полагаю, это из-за шутки Джошуа Блоха. :)

27 голосов
/ 23 июля 2014

Break полностью покидает цикл и выполняет операторы после цикла. Принимая во внимание, что Continue оставляет текущую итерацию и выполняется со следующим значением в цикле.

Этот код объясняет все:

public static void main(String[] args) {
    for(int i=0;i<10;i++)
    {
        if (i==4)
        {
            break;
        }
        System.out.print(i+"\t");

    }
    System.out.println();
    for(int i=0;i<10;i++)
    {

        if (i==4)
        {
            continue;
        }
        System.out.print(i+"\t");
    }
}

Выход:

0   1   2   3   
0   1   2   3   5   6   7   8   9
23 голосов
/ 20 января 2009

break полностью выходит из цикла. continue пропускает операторы после оператора continue и продолжает цикл.

7 голосов
/ 02 мая 2018

Заявление о перерыве

Иногда необходимо выйти из цикла , прежде чем цикл завершит полную итерацию по всем значениям шага. Например, перебирая список чисел, пока не найдете число, удовлетворяющее определенному условию. Или зацикливание потока символов из файла, пока не будет прочитан определенный символ.

В следующем примере мы используем простой цикл for для вывода значений от 0 до 9:

for(int i=0; i<10; i++) {
  System.out.println(i);
}

Выход:

0
1
2
3
4
5
6
7
8
9

Теперь, если мы добавим оператор break, когда i == 4, наш код выйдет из цикла, как только я равняюсь 4. Вы можете использовать оператор break для выхода из циклов for, while и циклов do-while. Оператор break будет выходить только из текущего цикла. Чтобы выйти из внешнего цикла из вложенного внутреннего цикла, вам необходимо использовать метки с оператором break.

for(int i=0; i<10; i++) {
  System.out.println(i);
  if(i==4) {
    break;
  }
}

Выход:

0
1
2
3
4

Продолжить заявление

Java continue инструкция пропускает текущую итерацию цикла и переходит непосредственно к следующей итерации. После вызова оператора continue в цикле for выполнение цикла выполнит значение шага и оценит логическое условие перед продолжением следующей итерации. В следующем примере мы распечатываем все значения от 0 до 9 в цикле, но пропускаем распечатку 4.

for(int i=0; i<10; i++) {
  if(i==4) {
    continue;
  }
  System.out.println(i);
}

Выход:

0
1
2
3
5 <---- SKIPPED OVER 4 and continued with next loop iteration
6
7
8
9

Метка петли - оператор разрыва Вы можете использовать метки во вложенных циклах , указав, где вы хотите продолжить выполнение после выхода из внутреннего цикла. Обычно оператор break будет выходить только из самого внутреннего цикла, поэтому, когда вы хотите выйти из внешнего цикла, вы можете использовать метки для достижения этой цели, по сути, делая что-то похожее на оператор goto.

В следующем примере используются 3 цикла, все они вложены друг в друга. Поскольку нет никакого способа полностью выйти из самого внешнего цикла изнутри самого внутреннего цикла, мы можем использовать метку «external1», чтобы выполнить это, и указать метку рядом с оператором break.

outer1:
for(int i=0; i<5; i++) {
  for(int j=0; j<4; j++) {
    for(int k=0; k<2; k++) {
      System.out.println("[" + i + "][" + j + "][" + k + "]");
      if(j == 3) {
        break outer1;
      }
    }
  }
}

Выход:

[0][0][0]
[0][0][1]
[0][1][0]
[0][1][1]
[0][2][0]
[0][2][1]
[0][3][0]

Обратите внимание, что последняя отображаемая строка имеет вид « 0 [0]», где j == 3, и именно здесь мы назвали «break external1;», чтобы выйти из самого внешнего цикла.

Loop Labels - Продолжить заявление

Вы также можете использовать метки с ключевым словом continue для продолжения цикла с определенной точки. Если взять предыдущий пример и просто изменить одну строку, указав continue outer1; вместо break outer1;, цикл продолжит цикл с метки outer1 вместо выхода из цикла. Обратите внимание, как каждый раз, когда вызывается continue outer1;, код продолжается из внешнего цикла после увеличения индекса цикла i на 1.

outer1:
for(int i=0; i<5; i++) {
  for(int j=0; j<4; j++) {
    for(int k=0; k<2; k++) {
      System.out.println("[" + i + "][" + j + "][" + k + "]");
      if(j == 3) {
        continue outer1;
    }
  }
}

[0][0][0]
[0][0][1]
[0][1][0]
[0][1][1]
[0][2][0]
[0][2][1]
[0][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[1][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[1][0][1]
[1][1][0]
[1][1][1]
[1][2][0]
[1][2][1]
[1][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[2][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[2][0][1]
[2][1][0]
[2][1][1]
[2][2][0]
[2][2][1]
[2][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[3][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[3][0][1]
[3][1][0]
[3][1][1]
[3][2][0]
[3][2][1]
[3][3][0] <---- CONTINUE WITH LABEL CALLED HERE
[4][0][0] <---- CONTINUES FROM NEXT ITERATION OF OUTER LOOP
[4][0][1]
[4][1][0]
[4][1][1]
[4][2][0]
[4][2][1]
[4][3][0]

Источник: Циклы в Java - Ultimate Guide

7 голосов
/ 20 января 2009

Отличный ответ просто и точно.

Я бы добавил пример кода.

C:\oreyes\samples\java\breakcontinue>type BreakContinue.java

    class BreakContinue {

        public static void main( String [] args ) {

               for( int i = 0 ; i < 10 ; i++ ) {

                     if( i % 2 == 0) { // if pair, will jump
                         continue; // don't go to "System.out.print" below.
                     }

                     System.out.println("The number is " + i );

                     if( i == 7 ) {
                         break; // will end the execution, 8,9 wont be processed
                      }

               }
        }

    }

C:\oreyes\samples\java\breakcontinue>java BreakContinue
The number is 1
The number is 3
The number is 5
The number is 7
6 голосов
/ 20 января 2009

A break оператор приводит к завершению оператора, к которому он применяется (switch, for, do или while).

Оператор continue используется для завершения текущей итерации цикла и возврата управления в оператор цикла.

5 голосов
/ 22 апреля 2015

continue пропускает текущее выполнение loop и MOVES TO следующий loop , тогда как break MOVES OUT из loop и выполняет следующий оператор после loop. Я узнал разницу, используя следующий код. Проверьте различные выводы. Надеюсь, это поможет.

public static void main(String[] args) {
    for(int i = 0; i < 5; i++){
        if (i == 3) {
            continue;
        }
        System.out.print(i);
    }
}//prints out 0124, continue moves to the next iteration skipping printing 3

public static void main(String[] args) {
    for(int i = 0; i < 5; i++){
        if (i == 3) {
            break;
        }
        System.out.print(i);
    }
}//prints out 012, break moves out of the loop hence doesnt print 3 and 4
4 голосов
/ 20 января 2009

Рассмотрим следующее:

int n;
for(n = 0; n < 10; ++n) {
    break;
}
System.out.println(n);

break приводит к завершению цикла, и значение n равно 0.

int n;
for(n = 0; n < 10; ++n) {
    continue;
}
System.out.println(n);

continue заставляет счетчик программы вернуться к первой строке цикла (условие проверяется и значение n увеличивается), а конечное значение n равно 10 .

Следует также отметить, что break только завершает выполнение цикла, в котором он находится:

int m;
for(m = 0; m < 5; ++m)
{
    int n;
    for(n = 0; n < 5; ++n) {
        break;
    }
    System.out.println(n);
}
System.out.println(m);

Будет выводить что-то с эффектом

0
0
0
0
0
5
...