Co to jest słowo kluczowe „kontynuuj” i jak działa w Javie?


302

Po raz pierwszy zobaczyłem to słowo kluczowe i zastanawiałem się, czy ktoś może mi wyjaśnić, co robi.

  • Co to jest continue słowo kluczowe?
  • Jak to działa?
  • Kiedy jest używany?

Odpowiedzi:


416

continueOświadczenie bez etykiety ponownie wykonać ze stanu najgłębszej whilelub dopętli, az wypowiedzi aktualizacji najbardziej wewnętrznej forpętli. Jest często używany do wcześniejszego zakończenia przetwarzania pętli, a tym samym do unikania głęboko zagnieżdżonych ifinstrukcji. W poniższym przykładzie continuezostanie wyświetlony następny wiersz bez przetwarzania następującej instrukcji w pętli.

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

Z etykietą continueponownie uruchomi się z pętli z odpowiednią etykietą, a nie z wewnętrznej pętli. Można tego użyć do ucieczki głęboko zagnieżdżonych pętli lub po prostu dla przejrzystości.

Czasami continuejest również używany jako symbol zastępczy, aby uczynić pustą treść pętli bardziej wyraźną.

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

Ta sama instrukcja bez etykiety istnieje również w C i C ++. Odpowiednikiem w Perlu jest next.

Ten typ przepływu sterowania nie jest zalecany, ale jeśli tak zdecydujesz, możesz także użyć continuedo symulacji ograniczonej formy goto. W poniższym przykładzie continueponownie uruchomi pustą for (;;)pętlę.

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

513

continuejest trochę jak goto. Czy znasz break? W przeciwieństwie do nich łatwiej jest myśleć o nich:

  • break kończy pętlę (przeskakuje do kodu poniżej).

  • continue kończy resztę przetwarzania kodu w pętli dla bieżącej iteracji, ale kontynuuje pętlę.


1
dobry przykład na przerwę i kontynuuj, myślałem, że to samo przed>. <
yfsx

Niemożliwe, aby nie uczynić go ładnym idealnym 500! +1
hat

100

Zobaczmy przykład:

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

Otrzymałoby to sumę tylko liczb nieparzystych od 1 do 100.


28

Jeśli myślisz o ciele pętli jako podprogramie, continueto jest coś w rodzaju return. To samo słowo kluczowe istnieje w C i służy temu samemu celowi. Oto wymyślony przykład:

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

Spowoduje to wydrukowanie tylko liczb nieparzystych.


16

Ogólnie widzę continue(i break) jako ostrzeżenie, że kod może wymagać pewnego refaktoryzacji, szczególnie jeśli whilelubfor deklaracja pętli nie jest natychmiast widoczna. To samo dotyczyreturn metody, ale z nieco innego powodu.

Jak już powiedzieli inni, continue przechodzi do następnej iteracji pętli, natomiastbreak wychodzi z otaczającej pętli.

Mogą to być przedziały czasowe konserwacji, ponieważ nie ma bezpośredniego połączenia między continue/ breaka pętlą, którą kontynuuje / przerywa poza kontekstem; dodaj wewnętrzną pętlę lub przenieś „wnętrzności” pętli do osobnej metody i uzyskasz ukryty efekt continue/break fail.

IMHO najlepiej użyć ich jako ostateczności, a następnie upewnić się, że ich użycie jest ściśle zgrupowane na początku lub na końcu pętli, aby następny programista mógł zobaczyć „granice” pętli na jednym ekranie .

continue, breaki return(inne niż One True Return na końcu twojej metody) wszystkie należą do ogólnej kategorii „ukrytych GOTO”. Umieszczają kontrolę pętli i funkcji w nieoczekiwanych miejscach, co następnie powoduje błędy.


Interesuje mnie powód, dla którego zwrot jest zły. Mam już wrażenie, że zwrot jest zły, ponieważ Scala nie zachęca do powrotu .
Jus12

1
Z drugiej strony zezwolenie na powrót metody z głęboko zagnieżdżonej pętli może być najłatwiejszym, najbardziej czytelnym i rozsądnym sposobem wykonywania zadań, zamiast tworzenia dodatkowych zmiennych, aby wyjście z pętli wyglądało bardziej czysto.
David R Tribble,

5

„kontynuuj” w Javie oznacza przejście do końca bieżącej pętli, oznacza: jeśli kompilator zobaczy kontynuację w pętli, przejdzie do następnej iteracji

Przykład: jest to kod do drukowania liczb nieparzystych od 1 do 10

kompilator zignoruje kod wydruku, ilekroć będzie kontynuował przechodzenie do następnej iteracji

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


4

Jak już wspomniano continue, pominie przetwarzanie kodu pod nim i do końca pętli. Następnie zostaniesz przeniesiony do stanu pętli i uruchom następną iterację, jeśli ten warunek nadal się utrzymuje (lub jeśli istnieje flaga, do wskazanego stanu pętli).

Należy podkreślić, że w przypadku do - whileciebie jesteś przenoszony do stanu na dole po, a continuenie na początku pętli.

Dlatego wiele osób nie odpowiada poprawnie na to, co wygeneruje poniższy kod.

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

* Jeśli twoja odpowiedź aSetbędzie zawierała liczby nieparzyste tylko w 100% ... jesteś w błędzie!


4

Kontynuuj jest słowem kluczowym w Javie i służy do pominięcia bieżącej iteracji.

Załóżmy, że chcesz wydrukować wszystkie liczby nieparzyste od 1 do 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);
        }

    }
}

Instrukcja Kontynuuj w powyższym programie po prostu pomija iterację, gdy i jest parzyste, i wypisuje wartość i, gdy jest nieparzysta.

Instrukcja Kontynuuj po prostu wyciąga Cię z pętli bez wykonywania pozostałych instrukcji w pętli i uruchamia następną iterację.


3

Rozważ warunek If Else. Instrukcja continu wykonuje to, co jest w warunku i wychodzi z tego warunku, tzn. Przeskakuje do następnej iteracji lub warunku. Ale Przerwa opuszcza pętlę. Rozważ następujący program. „

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.");
    }

}

Wyświetli się: aa cc Out of the loop.

Jeśli użyjesz break zamiast kontynuowania (After if.), Po prostu wypisze aa i poza pętlą .

Jeśli warunek „bb” jest równy ss: dla Kontynuuj: przechodzi do następnej iteracji, tj. „Cc” .equals (ss). For Break: wychodzi z pętli i drukuje „Out of the loop”.


2
Całkiem pewne, że wypisze również cc, ponieważ „cc”! = „Bb”, a instrukcja print jest przedbreak
Ted Delezene

2

Jestem trochę spóźniony na imprezę, ale ...

Warto wspomnieć, że continuejest to przydatne w przypadku pustych pętli, w których cała praca jest wykonywana w wyrażeniu warunkowym kontrolującym pętlę. Na przykład:

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

W takim przypadku cała praca z odczytaniem znaku i dołączeniem go bufferodbywa się w wyrażeniu kontrolującym whilepętlę. continueOświadczenie służy jako wskaźnik wizualny, że pętla nie potrzebuje organizm.

Jest to trochę bardziej oczywiste niż odpowiednik:

while (...)
{ }

i zdecydowanie lepszy (i bezpieczniejszy) styl kodowania niż używanie pustych instrukcji, takich jak:

while (...)
    ;

Zdecydowanie zgadzam się, że jest to czystszy i bardziej czytelny kod, ale nie jestem pewien, czy podążam za twoim argumentem, że jest on „bezpieczniejszy” niż inna opcja, while (instrukcja); rozdzielany bezpośrednio za pomocą średnika.
axolotl

@Aalok - Jest bezpieczniej, ponieważ pojedynczego średnika łatwo wizualnie przeoczyć. Łatwo jest również pominąć przypadkowo, co spowodowałoby, że następne stwierdzenie whilestało się treścią whileklauzuli, i które nie byłoby wizualnie oczywiste. Wyraźne continuejest oczywiste i przekazuje zamiar, którego nie zawiera puste stwierdzenie.
David R Tribble,

Rozumiem, więc masz na myśli głównie z perspektywy projektowania. To ma sens. Miałem coś wspólnego ze sposobem ułożenia pętli.
aksolotl


0

continue musi znajdować się w pętli, w przeciwnym razie pokazuje błąd poniżej:

Kontynuuj poza pętlą


0

Instrukcja kontynuacji jest używana w strukturze kontroli pętli, gdy trzeba natychmiast przejść do następnej iteracji pętli.

Można go używać z pętlą for lub while. Instrukcja kontynuacji Java jest używana do kontynuowania pętli. Kontynuuje bieżący przepływ programu i pomija pozostały kod w określonych warunkach.

W przypadku pętli wewnętrznej kontynuuje tylko pętlę wewnętrzną.

Możemy używać instrukcji kontynuacji Java we wszystkich typach pętli, takich jak pętla for, loop i do-while.

na przykład

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.");
    }
}

wynik:

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

[numer 5 pomija]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.