Может кто-нибудь объяснить, как перерыв и продолжить работу в циклах? [Дубликат]

Короткие и простые: поскольку элементы, которые вы ищете, не существуют в документе (пока).


В оставшуюся часть этого ответа я буду использовать getElementById как пример, но то же самое относится к getElementsByTagName , querySelector и любому другому методу DOM, который выбирает элементы.

Возможные причины

Есть две причины, по которым элемент может не существовать:

  1. Элемент с переданным идентификатором действительно не существует в документе. Вы должны дважды проверить, что идентификатор, который вы передаете на getElementById, действительно соответствует идентификатору существующего элемента в (сгенерированном) HTML и что у вас не было с ошибкой идентификатор (идентификаторы чувствительный !). Кстати, в большинстве современных браузеров , которые реализуют методы querySelector() и querySelectorAll(), нотация стиля CSS используется для извлечения элемента его id, например: document.querySelector('#elementID'), в отличие от способа, с помощью которого элемент извлекается его id в [[16]; в первом символе # необходимо, во втором это приведет к тому, что элемент не будет извлечен.
  2. Элемент не существует в данный момент , который вы вызываете getElementById ].

Последний случай довольно распространен. Браузеры анализируют и обрабатывают HTML сверху вниз. Это означает, что любой вызов элемента DOM, который встречается до появления этого элемента DOM в HTML, не будет выполнен.

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



Появляется div после script. В настоящий момент сценарий выполняется, элемент не существует , но и getElementById вернут null.

jQuery

То же самое относится к все селекторы с jQuery. jQuery не найдет элементов, если вы ошибочно написали ваш селектор, или вы пытаетесь выбрать их , прежде чем они на самом деле существуют .

Добавленный поворот - это когда jQuery не найден потому, что вы загрузили скрипт без протокола и запускаетесь из файловой системы:


этот синтаксис используется, чтобы позволить сценарию загружаться через HTTPS на странице с протоколом https: // и для загрузки HTTP-версии на странице с протоколом http: //

У этого есть неудачный побочный эффект попытки и невозможность загрузить file://somecdn.somewhere.com...


Решения

Прежде чем позвонить getElementById (или любой метод DOM, если на то пошло), убедитесь, что элементы, к которым вы хотите получить доступ, существуют, т. е. загружается DOM.

Это может быть обеспечено просто добавив ваш JavaScript после к соответствующему элементу DOM

, и в этом случае вы также можете поместить код непосредственно перед тегом закрывающего тела () (все DOM элементы будут доступны в момент выполнения скрипта). [/ g3 6]

Другие решения включают прослушивание событий load [MDN] или DOMContentLoaded [MDN] . В этих случаях не имеет значения, где в документе вы помещаете код JavaScript, вам просто нужно запомнить, чтобы весь обработчик DOM обрабатывался в обработчиках событий.

Пример:

window.onload = function() {
    // process DOM elements here
};

// or

// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
    // process DOM elements here
});

Более подробную информацию об обработке событий и различиях браузера см. в статьях на странице quirksmode.org .

jQuery

Сначала убедитесь, что jQuery загружен правильно , Используйте инструменты разработчика браузера , чтобы узнать, был ли найден файл jQuery и исправлен ли URL-адрес, если он не был (например, добавьте схему http: или https: в начале, отрегулируйте путь, и т. д.)

Прослушивание событий load / DOMContentLoaded - это именно то, что делает jQuery с .ready() [docs] . Весь ваш код jQuery, который влияет на элемент DOM, должен находиться внутри этого обработчика событий.

На самом деле в учебнике j8uery явно указано:

Как почти все, что мы делаем при использовании jQuery, читает или манипулирует объектной моделью документа (DOM), мы должны убедиться, что мы начинаем добавлять события и т. д., как только DOM готов.

Для этого мы регистрируем готовое событие для документа.

$(document).ready(function() {
   // do stuff when DOM is ready
});

В качестве альтернативы вы также можете использовать сокращенный синтаксис:

$(function() {
    // do stuff when DOM is ready
});

Оба эквивалентны.

210
задан Unsigned 11 July 2013 в 00:26
поделиться

19 ответов

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

430
ответ дан Francesco Menzani 17 August 2018 в 13:51
поделиться
  • 1
    Обратите внимание, что Java также содержит помеченные инструкции continue / break, которые имеют разную семантику :-) – Jay 20 January 2009 в 19:14
  • 2
    Это всего лишь основы перерыва и продолжаются. Для лучшего объяснения посмотрите на Jay's Post – Xn0vv3r 20 January 2009 в 19:16
  • 3
    Для тех, кто задается вопросом, чтобы использовать метку, вы пишете имя метки, за которым следует ':' перед циклом. – Caelum 9 June 2015 в 18:12
  • 4
    & Quot; разрыв & Quot; также завершит оператор switch – KillBill 16 August 2016 в 00:53
  • 5
    продолжит переход к следующей итерации, даже если она находится в выражении if else внутри a для каждого цикла? – klutch 21 March 2017 в 06:35

continue пропускает текущий цикл выполнения и ПЕРЕМЕЩАЕТСЯ к следующему циклу, тогда как break ПЕРЕМЕЩАЕТСЯ из цикла и выполняет следующий оператор после цикла. Я узнал разницу, используя следующий код. Проверьте различные выходные данные. Надеемся, что это поможет.

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
5
ответ дан Abdullah Khan 17 August 2018 в 13:51
поделиться

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

break

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

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

continue

Оператор continue пропускает текущую итерацию для for, while или do-while петля. Незамеченная форма пропускается до конца тела самого внутреннего цикла и оценивает логическое выражение, которое управляет циклом. [...]

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

93
ответ дан blong 17 August 2018 в 13:51
поделиться

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

Я бы добавил образец кода.

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
7
ответ дан Community 17 August 2018 в 13:51
поделиться

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
27
ответ дан Dhanuka 17 August 2018 в 13:51
поделиться

Проще говоря: break прекратит текущий цикл и продолжит выполнение в первой строке после окончания цикла. continue переходит в состояние цикла и продолжает выполнение цикла.

0
ответ дан Electrons_Ahoy 17 August 2018 в 13:51
поделиться

Заявление о переходе

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

В следующем примере мы используем простой цикл для печати значений от 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, наш код выйдет из цикла после того, как i будет равен 4. Вы можете использовать оператор break выходить из цикла for, а петли и циклы 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

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

в следующем примере используются 3 петли, все вложенные друг в друга. Поскольку полностью не вырваться из внешнего цикла больше внутри внутреннего цикла, мы можем использовать метку «outer1», чтобы выполнить это, и указать метку рядом с оператором 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 outer1;»

Ярлыки цикла - Продолжить утверждение

Вы также можете использовать метки с ключевым словом 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

3
ответ дан gomisha 17 August 2018 в 13:51
поделиться

Оператор break выходит из цикла (следующий оператор, который должен быть выполнен, является первым после закрытия), а continue запускает цикл на следующей итерации.

3
ответ дан Graeme Perrow 17 August 2018 в 13:51
поделиться

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

2
ответ дан Gumbo 17 August 2018 в 13:51
поделиться

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

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);

продолжает причины программный счетчик для возврата к первой строке цикла (условие проверяется, а значение 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
4
ответ дан Kevin Loney 17 August 2018 в 13:51
поделиться
  • 1
    В ваших примерах есть проблемы с переменными масштабами. – Darron 20 January 2009 в 19:51

Продолжить Установку прекратить итерацию и запустить следующую итерацию Ex:

System.out.println("continue when i is 2:");
    for (int i = 1; i <= 3; i++) {
        if (i == 2) {
            System.out.print("[continue]");
            continue;
        }
        System.out.print("[i:" + i + "]");
    }

и Break Statment остановить цикл или выйти из цикла

0
ответ дан mhdjazmati 17 August 2018 в 13:51
поделиться

вот семантика разрыва:

int[] a = new int[] { 1, 3, 4, 6, 7, 9, 10 };
// find 9
for(int i = 0; i < a.Length; i++)
{
    if (a[i] == 9) 
        goto goBreak;

    Console.WriteLine(a[i].ToString());      
}
goBreak:;

вот семантика продолжения:

int[] a = new int[] { 1, 3, 4, 6, 7, 9, 10 };
// skip all odds
for(int i = 0; i < a.Length; i++)
{
    if (a[i] % 2 == 1) 
        goto goContinue;

    Console.WriteLine(a[i].ToString());      

goContinue:;
}
1
ответ дан Michael Buen 17 August 2018 в 13:51
поделиться
  • 1
    В случае, если некоторые задавались вопросом, как это сделать в C # ??? :) – OscarRyz 20 January 2009 в 19:13
  • 2
    Разве C # не сломается; и продолжать; заявления? Я не могу в это поверить. – OscarRyz 20 January 2009 в 19:14
  • 3
    Да, C #, я просто объясняю семантику перерыва и продолжаю :-) – Michael Buen 20 January 2009 в 19:19
  • 4
    Вы ничего не объяснили, вы просто разместили код. Даже не прокомментированный код. Кусок кода не является объяснением или «семантикой». – user207421 26 November 2015 в 02:11

Чтобы предотвратить что-либо от выполнения, если условие выполнено, следует использовать continue и выйти из цикла, если условие выполнено, следует использовать разрыв.

Например, в приведенном ниже коде .

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

        if(i==3){

           continue;

        }
       System.out.println(i);
     }

Вышеприведенный код напечатает результат: 0 1 2 4

NOw рассмотрим этот код

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


            if(i==3){

                break;

            }
            System.out.println(i);
         }

Этот код напечатает 0 1 2

Это основное отличие в продолжении и разломе.

2
ответ дан Navankur Chauhan 17 August 2018 в 13:51
поделиться

Простая программа для понимания разницы между продолжением и разрывом

Когда используется continue

    public static void main(String[] args) {
    System.out.println("HelloWorld");
    for (int i = 0; i < 5; i++){
        System.out.println("Start For loop i = " + i);
        if(i==2){
            System.out.println("Inside if Statement for i = "+i);
           continue;
        }
        System.out.println("End For loop i = " + i);
    }
    System.out.println("Completely out of For loop");
}


OutPut:
HelloWorld
Start For loop i = 0
End For loop i = 0
Start For loop i = 1
End For loop i = 1
Start For loop i = 2
Inside if Statement for i = 2
Start For loop i = 3
End For loop i = 3
Start For loop i = 4
End For loop i = 4
Completely out of For loop

Когда используется break

public static void main(String[] args) {
    System.out.println("HelloWorld");
    for (int i = 0; i < 5; i++){
        System.out.println("Start For loop i = " + i);
        if(i==2){
            System.out.println("Inside if Statement for i = "+i);
           break;
        }
        System.out.println("End For loop i = " + i);
    }
    System.out.println("Completely out of For loop");
}

Output:
HelloWorld
Start For loop i = 0
End For loop i = 0
Start For loop i = 1
End For loop i = 1
Start For loop i = 2
Inside if Statement for i = 2
Completely out of For loop
21
ответ дан Rakitić 17 August 2018 в 13:51
поделиться
for (int i = 1; i <= 3; i++) {
        if (i == 2) {

            continue;
        }
        System.out.print("[i:" + i + "]");

попробуйте этот код в netbeans, вы поймете разницу между break и continue

for (int i = 1; i <= 3; i++) {
        if (i == 2) {

            break;
        }
        System.out.print("[i:" + i + "]");
0
ответ дан Siddharth 17 August 2018 в 13:51
поделиться

Во-первых, я думаю, вы должны знать, что есть два типа разрыва и продолжить в Java, которые помечены как break, немеченый разрыв, помечены как продолжены и немечены. Продолжайте, я буду говорить о различии между ними.

class BreakDemo {
public static void main(String[] args) {

    int[] arrayOfInts = 
        { 32, 87, 3, 589,
          12, 1076, 2000,
          8, 622, 127 };
    int searchfor = 12;

    int i;
    boolean foundIt = false;

    for (i = 0; i < arrayOfInts.length; i++) {
        if (arrayOfInts[i] == searchfor) {
            foundIt = true;
            break;//this is an unlabeled break,an unlabeled break statement terminates the innermost switch,for,while,do-while statement.
        }
    }

    if (foundIt) {
        System.out.println("Found " + searchfor + " at index " + i);
    } else {
        System.out.println(searchfor + " not in the array");
    }
}

Инструкция о немедленном разрыве завершает самый внутренний коммутатор, в то время как оператор do-while.

public class BreakWithLabelDemo {
public static void main(String[] args) {
    search:
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            System.out.println(i + " - " + j);
            if (j == 3)
                break search;//this is an labeled break.To notice the lab which is search.
        }
    }
}

Обозначенный разрыв прерывает внешний оператор. Если вы javac и java это демо, вы получите:

0 - 0
0 - 1
0 - 2
0 - 3
class ContinueDemo {
public static void main(String[] args) {

    String searchMe = "peter piper picked a " + "peck of pickled peppers";
    int max = searchMe.length();
    int numPs = 0;

    for (int i = 0; i < max; i++) {
        // interested only in p's
        if (searchMe.charAt(i) != 'p')
            continue;//this is an unlabeled continue.

        // process p's
        numPs++;
    }
    System.out.println("Found " + numPs + " p's in the string.");
}

Оператор nonabeled continue пропускает текущую итерацию инструкции for, while, do-while.

public class ContinueWithLabelDemo {
public static void main(String[] args) {
    search:
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 5; j++) {
            System.out.println(i + " - " + j);
            if (j == 3)
                continue search;//this is an labeled continue.Notice the lab which is search
        }
    }
}

Обозначенное выражение continue пропускает текущую итерацию внешнего цикла, помеченного данной меткой, если вы javac и java демо, вы получите:

0 - 0
0 - 1
0 - 2
0 - 3
1 - 0
1 - 1
1 - 2
1 - 3
2 - 0
2 - 1
2 - 2
2 - 3

, если у вас есть какие-либо вопросы, вы можете увидеть учебник по Java этого : введите описание ссылки здесь

1
ответ дан thinkinjava 17 August 2018 в 13:51
поделиться

, поэтому вы находитесь внутри цикла for или while. Использование break; выведет вас за пределы цикла. Как и в, это закончится. Продолжать; скажет ей запустить следующую итерацию.

Нет смысла использовать continue в инструкции if, но break; Полезно. В переключателе ... случае, всегда используйте break; для завершения дела, поэтому он не выполняет другого случая.

-1
ответ дан user 17 August 2018 в 13:51
поделиться
  • 1
    «Нет смысла использовать продолжение в инструкции if» - Да, это имеет смысл. Например, когда выполняется условие, вы можете пропустить некоторые части обработки на самом этапе итерации. – Sk8erPeter 8 September 2015 в 15:08
  • 2
    Это не только бессмысленно, но и незаконно, , если if не находится внутри цикла, и в этом случае есть много точек. – user207421 26 November 2015 в 02:13
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;

Я думаю, это от Джошуа Блоха quizzle. :)

57
ответ дан user unknown 17 August 2018 в 13:51
поделиться
  • 1
    Отличная идея с обструкцией, не будет ли работать http://stackoverflow.com/questions/462373/? – Caelum 9 June 2015 в 18:10
  • 2
    @ user2104648: да, это, должно быть, ошибка вырезания 'n'. – user unknown 11 June 2015 в 03:15

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

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

6
ответ дан Yuval Adam 17 August 2018 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: