Що таке ключове слово «продовжити» і як воно працює на Java?


302

Я вперше побачив це ключове слово і мені було цікаво, чи хтось може мені пояснити, що це робить.

  • Що таке continueключове слово?
  • Як це працює?
  • Коли він використовується?

Відповіді:


416

continueЗаява без етикетки буде переоформити від стану самих внутрішнього whileабо doпетлі, і з виразу поновлення самого внутрішнього forциклу. Він часто використовується для раннього завершення обробки циклу і тим самим уникати глибоко вкладених ifоператорів. У наступному прикладі continueвийде наступний рядок, не обробляючи наступне твердження в циклі.

while (getNext(line)) {
  if (line.isEmpty() || line.isComment())
    continue;
  // More code here
}

З міткою continueбуде повторно виконано з циклу з відповідною міткою, а не з внутрішнього циклу. Це можна використовувати для виходу з глибоко вкладених петель або просто для наочності.

Іноді continueтакож використовується як заповнювач, щоб зробити тіло порожнього циклу більш чітким.

for (count = 0; foo.moreData(); count++)
  continue;

Це ж твердження без мітки існує і в C і C ++. Еквівалент у Perl є next.

Цей тип управління потоком не рекомендується, але якщо ви вирішите, ви також можете використовувати continueдля імітації обмеженої форми goto. У наступному прикладі continueзаново буде виконано порожній for (;;)цикл.

aLoopName: for (;;) {
  // ...
  while (someCondition)
  // ...
    if (otherCondition)
      continue aLoopName;

513

continueподібний goto. Ви знайомі break? Про них легше думати на противагу:

  • break завершує цикл (переходить до коду під ним).

  • continue завершує решту обробки коду в циклі для поточної ітерації, але продовжує цикл.


1
гарний приклад для перерви та продовження, я думав, що це було і раніше>. <
yfsx

Неможливо не зробити це приємним ідеальним 500! +1
капелюх

100

Давайте подивимось приклад:

int sum = 0;
for(int i = 1; i <= 100 ; i++){
    if(i % 2 == 0)
         continue;
    sum += i;
}

Це отримало б суму лише непарних чисел від 1 до 100.


28

Якщо ви вважаєте тіло циклу як підпрограму, continueце схоже return. Одне і те ж ключове слово існує в C і виконує ту саму мету. Ось надуманий приклад:

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

Це видасть лише непарні номери.


16

Як правило, я бачу continuebreak) попередження про те, що код може використовувати деякий рефакторинг, особливо якщо декларація whileабо forцикл не відразу помічена. Те саме стосується returnсередини методу, але з дещо іншої причини.

Як уже говорили інші, continueрухаємося до наступної ітерації циклу, покиbreak виходить з циклу, що вкладається.

Це можуть бути тимчасові бомби обслуговування, оскільки між continue/ breakта циклом, який він продовжує / порушує, крім контексту, немає безпосереднього зв’язку ; додайте внутрішню петлю або перемістіть "кишки" циклу в окремий метод, і у вас є прихований ефект continue/ / breakневдача.

ІМХО, найкраще використовувати їх як міру останньої інстанції, а потім переконатися, що їх використання щільно згруповано на початку або в кінці циклу, щоб наступний розробник міг бачити "межі" циклу на одному екрані .

continue, breakІ return(крім Єдиного Істинного Повернення в кінці вашого методу) все потрапляють в загальну категорію «прихованих GOTOS». Вони розміщують цикл і управління функціями в несподіваних місцях, що згодом викликає помилки.


Мене цікавить причина, чому повернення погано. У мене вже є відчуття, що повернення погано, оскільки Скала не заохочує повернення .
липня 1616 року

1
З іншого боку, дозволити метод повернутися з глибоко вкладеного циклу може бути найпростішим, найчитабельнішим та найрозумнішим способом вчинити, а не створювати зайві змінні просто для того, щоб вихід із циклу виглядав більш чистим.
David R Tribble

5

"продовжити" в Java означає перейти до кінця поточного циклу, означає: якщо компілятор бачить продовження в циклі, він перейде до наступної ітерації

Приклад: Це код для друку непарних чисел від 1 до 10

компілятор буде ігнорувати код друку щоразу, коли побачить продовження переходу до наступної ітерації

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


4

Як уже згадувалося, continueбуде пропущено обробку коду під ним і до кінця циклу. Потім ви переходите до стану циклу і запускаєте наступну ітерацію, якщо ця умова все-таки виконується (або якщо є прапор, до умовної позначення циклу).

Потрібно підкреслити, що у випадку, коли do - whileви переходите до стану внизу після a continue, а не на початку циклу.

Ось чому багато людей не відповідають правильно, що генерує наступний код.

    Random r = new Random();
    Set<Integer> aSet= new HashSet<Integer>();
    int anInt;
    do {
        anInt = r.nextInt(10);
        if (anInt % 2 == 0)
            continue;
        System.out.println(anInt);
    } while (aSet.add(anInt));
    System.out.println(aSet);

* Якщо ваша відповідь така, що aSetбуде містити непарні числа лише на 100% ... ви помиляєтеся!


4

Продовжити - ключове слово на Java, і воно використовується для пропускання поточної ітерації.

Припустимо, ви хочете надрукувати всі непарні числа від 1 до 100

public class Main {

    public static void main(String args[]) {

    //Program to print all odd numbers from 1 to 100

        for(int i=1 ; i<=100 ; i++) {
            if(i % 2 == 0) {
                continue;
            }
            System.out.println(i);
        }

    }
}

Продовжити оператор у вищевказаній програмі просто пропускає ітерацію, коли я парний, і друкує значення i, коли воно непарне.

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


3

Розглянемо умову If Else. Оператор продовження виконує те, що є в умові, і виходить з умови, тобто переходить до наступної ітерації чи умови. Але Перерва залишає петлю. Розглянемо наступну програму. '

public class ContinueBreak {
    public static void main(String[] args) {
        String[] table={"aa","bb","cc","dd"};
        for(String ss:table){
            if("bb".equals(ss)){
                continue;
            }
            System.out.println(ss);
            if("cc".equals(ss)){
                break;
            }
        }
        System.out.println("Out of the loop.");
    }

}

Він надрукує: aa cc З циклу.

Якщо ви використовуєте перерву замість продовження (Після, якщо.), Вона просто надрукує aa і з циклу .

Якщо умова "bb" дорівнює ss, виконується: Для продовження: Переходить до наступної ітерації, тобто "cc" .equals (ss). Для перерви: він виходить із циклу та друкує "З циклу".


2
Досить впевнений, що він також надрукує cc, оскільки "cc"! = "Bb", а заява надрукована ранішеbreak
Ted Delezene

2

Я трохи запізнююся на вечірку, але ...

Варто згадати, що continueкорисно для порожніх циклів, де вся робота виконується в умовному виразі, що керує циклом. Наприклад:

while ((buffer[i++] = readChar()) >= 0)
    continue;

У цьому випадку вся робота з читання персонажа та його додавання bufferвиконується у виразі, що керує whileциклом. continueЗаява є візуальним індикатором , що петля не потрібно тіло.

Це трохи більш очевидно, ніж еквівалент:

while (...)
{ }

і, безумовно, кращий (і безпечніший) стиль кодування, ніж використання порожнього оператора типу:

while (...)
    ;

Я, безумовно, погоджуюся, що це чистіший і читабельніший код, але я не впевнений, що я дотримуюся ваших аргументів про те, що він "безпечніший", ніж інший варіант, в той час як (заява); окреслено безпосередньо крапкою з комою.
аксолотль

@Aalok - Це безпечніше, оскільки одиноку крапку з комою легко пропустити візуально. Це також легко вийти випадково, що зробить наступне твердження після того, як whileстане частиною whileпункту, і що не буде візуально очевидним. Явне continueочевидне і передає наміри, що порожній вислів не робить.
David R Tribble

Я бачу, значить, ви маєте на увазі переважно з точки зору дизайну. Що має сенс. У мене було щось, що лежить в основі того, як структура розуму структурована.
аксолотль

1

В основному в java, продовження - це заява. Отже, оператор продовження зазвичай використовується разом із циклами, щоб пропустити поточну ітерацію.

Про те, як і коли він використовується в java, перейдіть за посиланням нижче. Він отримав пояснення на прикладі.

https://www.flowerbrackets.com/continue-java-example/

Сподіваюся, це допомагає !!


0

continue має бути всередині циклу. В іншому випадку це показанопомилка нижче:

Продовжуйте поза петлею


0

Оператор продовження використовується в структурі управління циклом, коли вам потрібно негайно перейти до наступної ітерації циклу.

Її можна використовувати з циклом або під час циклу. Оператор продовження Java використовується для продовження циклу. Він продовжує поточний потік програми та пропускає код, що залишився, за вказаною умовою.

У разі внутрішньої петлі вона продовжує лише внутрішню петлю.

Ми можемо використовувати оператор продовження Java у всіх типах циклів, таких як цикл, в той час як цикл і цикл виконання.

наприклад

class Example{
    public static void main(String args[]){
        System.out.println("Start");
        for(int i=0; i<10; i++){
            if(i==5){continue;}
            System.out.println("i : "+i);   
        }
        System.out.println("End.");
    }
}

вихід:

Start
i : 0
i : 1
i : 2
i : 3
i : 4
i : 6
i : 7
i : 8
i : 9
End.

[число 5 пропускає]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.