JavaRush /Blog Java /Random-PL /Operatorzy skoków
articles
Poziom 15

Operatorzy skoków

Opublikowano w grupie Random-PL
Java obsługuje trzy operatory skoku break- continuei return. Przenoszą kontrolę do innej części programu. Rozważmy szczegółowo każdego z operatorów. Operatory przejścia - 1

Korzystanie z operatorabreak

Operator breakw Javie jest używany w trzech przypadkach. Po pierwsze, jak już widziałeś, kończy sekwencję instrukcji w gałęziach instrukcji switch. Po drugie, można go użyć do wyjścia z pętli. Po trzecie, można go użyć jako „cywilizowanej” formy operatora bezwarunkowego skoku goto. W tej sekcji opisano dwa ostatnie przypadki. Użyj break, aby wyjść z pętli Używając break, możesz wymusić natychmiastowe zakończenie pętli, pomijając wyrażenie warunkowe i cały pozostały kod w treści pętli. breakKiedy w pętli napotkana zostanie instrukcja , druga instrukcja kończy się, a sterowanie programem zostaje przekazane instrukcji następującej po niej. Prosty przykład:
// Использование break для выхода из цикла.
public class BreakLoop {

  public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
      if (i == 4) {
        break; // завершить цикл, если i = 4
      }
      System.out.println("i: " + i);
    }
    System.out.println("Цикл завершен.");
  }
}
Ten program generuje następujące dane wyjściowe:
i: 0
i: 1
i: 2
i: 3
Цикл завершен.
Chociaż pętla forzostała tutaj zaprojektowana tak, aby wykonywać swoje instrukcje od 0 do 99 razy, operator breakpowoduje jej wcześniejsze zakończenie, gdy i wynosi 4. Operatora breakmożna używać z dowolną pętlą Java, łącznie z pętlami celowo nieskończonymi. Na przykład poniżej znajduje się poprzedni program zakodowany za pomocą pętli while. Dane wyjściowe tego programu są takie same jak jego poprzednika.
// Использование break для выхода из while-цикла.
public class BreakLoop2 {

  public static void main(String[] args) {
    int i = 0;
    while (i < 100) {
      if (i == 4) {
        break; // закончить цикл, если i = 4
      }
      System.out.println("i: " + i);
      i++;
    }
    System.out.println("Цикл завершен.");
  }
}
W przypadku użycia w zestawie zagnieżdżonych pętli instrukcja breakwyjdzie tylko z najbardziej wewnętrznej pętli. Na przykład:
// Использование break во вложенных циклах.
public class BreakLoop3 {

  public static void main(String[] args) {
    for (int i = 0; i < 3; i++) {
      System.out.print("Итерация " + i + ": ");
      for (int j = 0; j < 10; j++) {
        if (j == 4) {
          break; // закончить цикл, если j = 4
        }
        System.out.print(j + " ");
      }
      System.out.println();
    }
    System.out.println("Цикл завершен.");
  }
}
Ten program generuje następujące dane wyjściowe:
Итерация 0: 0 1 2 3
Итерация 1: 0 1 2 3
Итерация 2: 0 1 2 3
Цикл завершен.
Jak widać, instrukcja breakw pętli wewnętrznej powoduje zakończenie tylko tej pętli. Nie ma to wpływu na pętlę zewnętrzną. Dodajmy jeszcze dwie uwagi dot break. Po pierwsze, w pętli może pojawić się wiele instrukcji break. Jednak bądź ostrożny. Zbyt wiele z nich ma tendencję do niszczenia kodu. Po drugie, break, które kończy instrukcję - switchwpływa tylko na instrukcję - switch(a nie na pętle ją zawierające). Komentarz: Breaknie został zaprojektowany jako normalny sposób zakończenia pętli. Do tego celu służy wyrażenie warunkowe nagłówka pętli. Operatora breaknależy używać do przerywania pętli tylko wtedy, gdy zaistnieją pewne szczególne sytuacje.

Użyj breakjako formularzagoto

Oprócz tego, że jest używany w instrukcjach switch i pętlach, breakmoże być również używany samodzielnie jako „cywilizowana” forma pliku goto. Java nie zawiera operatora, gotoponieważ wykonuje rozgałęzienie w sposób dowolny i nieustrukturyzowany. Kod, który intensywnie używa ., gotojest zazwyczaj trudny do zrozumienia i utrzymania. Zastępuje także niektóre optymalizacje kompilatora. Istnieje jednak kilka miejsc w programie, w których gotoprzepływ kontroli jest cenną i uzasadnioną konstrukcją. Może to być na przykład gotoprzydatne podczas wychodzenia z głęboko zagnieżdżonego zestawu pętli. Aby obsłużyć takie sytuacje, Java definiuje rozszerzoną formę operatora break. Za jego pomocą możesz wyjść z jednego lub większej liczby bloków kodu. Bloki te nie muszą być częścią pętli lub instrukcji switch. Może to być dowolny blok. Następnie możesz dokładnie określić, gdzie będzie kontynuowana realizacja, ponieważ ten formularz breakwspółpracuje ze znakiem i zapewnia korzyści goto, omijając jego problemy. Instrukcja breakoznaczona etykietą ma następującą ogólną postać: break label; Oto labelnazwa etykiety identyfikującej jakiś blok kodu. Kiedy ten formularz breakjest wykonywany, kontrola jest przekazywana z nazwanego bloku kodu (którego etykieta jest określona w instrukcji break) do instrukcji następującej po tym bloku. Zaznaczony blok kodu musi zawierać tę instrukcję break, ale nie jest wymagane, aby to włączenie było bezpośrednie (tzn. breakmoże być zawarte nie bezpośrednio w bloku z własną etykietą, ale w bloku zagnieżdżonym w nim, ewentualnie również oznaczonym) . Oznacza to, że możesz użyć zaznaczonego operatora, breakaby uciec ze zbioru zagnieżdżonych bloków. Ale nie można użyć breakbloku kodu, który nie zawiera pliku break. Aby nazwać blok, umieść etykietę na początku bloku (przed otwierającym nawiasem klamrowym). Etykieta to dowolny prawidłowy identyfikator Java, po którym następuje dwukropek. Po oznakowaniu bloku jego etykieta może zostać użyta jako argument operatora break. Spowoduje to kontynuację wykonywania od końca zaznaczonego bloku. Na przykład poniższy program zawiera trzy zagnieżdżone bloki, każdy z własną etykietą. Operator breakprzesuwa się do przodu, poza koniec bloku oznaczonego etykietą second, pomijając dwóch operatorów println().
// Использование break Jak цивLubзованной формы goto.
public class Break {

  public static void main(String[] args) {
    boolean t = true;
    first:
    {
      second:
      {
        third:
        {
          System.out.println("Перед оператором break.");
          if (t) {
            break second; // выход из блока second
          }
          System.out.println("Данный оператор никогда не выполнится");
        }
        System.out.println("Данный оператор никогда не выполнится ");
      }
      System.out.println("Данный оператор размещен после блока second.");
    }
  }
}
Uruchomienie tego programu generuje następujące dane wyjściowe:
Перед оператором break.
Данный оператор размещен после блока second.
Jednym z najczęstszych zastosowań operatora oznaczonego breakjest ucieczka od zagnieżdżonych pętli. Na przykład w poniższym programie pętla zewnętrzna jest wykonywana tylko raz:
// Использование break для выхода из вложенных циклов.
public class BreakLoop4 {

  public static void main(String[] args) {
    outer:
    for (int i = 0; i < 3; i++) {
      System.out.print("Итерация " + i + ": ");
      for (int j = 0; j < 100; j++) {

        if (j == 10) {
          break outer; // выйти из обоих циклов
        }
        System.out.print(j + " ");
      }
      System.out.println("Эта строка никогда не будет выведена");
    }
    System.out.println("Цикл завершен.");
  }
}
Program generuje następujące dane wyjściowe:
Итерация 0: 0 1 2 3 4 5 6 7 8 9 Цикл завершен.
Łatwo zauważyć, że gdy pętla wewnętrzna zostanie przerwana przed końcem pętli zewnętrznej, obie pętle się kończą. Pamiętaj, że nie możesz wykonać break-skoku do żadnej etykiety, która nie jest zdefiniowana dla otaczającego bloku. Na przykład następujący program jest nieprawidłowy i nie zostanie skompilowany:
// Эта программа содержит ошибку.
public class BreakErr {

  public static void main(String[] args) {
    one:
    for (int i = 0; i < 3; i++) {
      System.out.print("Итерация " + i + ": ");
    }
    for (int j = 0; j < 100; j++) {
      if (j == 10) {
        break one; //He верно!
      }
      System.out.print(j + " ");
    }
  }
}
Ponieważ pętla oznaczona jako jedynka nie zawiera instrukcji break, nie jest możliwe przekazanie sterowania do tego bloku.

Korzystanie z operatoracontinue

Czasami warto wcześniej rozpocząć następną iterację pętli. Oznacza to, że musisz kontynuować wykonywanie pętli, ale przestać przetwarzać resztę kodu w jej treści dla tej konkretnej iteracji. W rzeczywistości jest to gotoprzejście od kolejnych operacji na treści do końca bloku pętli. Czynność tę wykonuje operator continue. W pętlach operator whileand powoduje przeniesienie sterowania bezpośrednio do wyrażenia warunkowego sterującego pętlą. W pętli sterowanie przechodzi najpierw do iteracyjnej części instrukcji , a następnie do wyrażenia warunkowego. We wszystkich trzech pętlach pomijany jest dowolny kod pośredni. Poniżej podano przykładowy program, który wypisuje po dwie liczby w każdym wierszu:do whilecontinueforforcontinue
// Демонстрирует continue.
public class Continue {

  public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
      System.out.print(i + " ");
      if (i % 2 == 0) {
        continue;
      }
      System.out.println("");
    }
  }
}
Ten kod używa operacji %(modulo), aby sprawdzić, czy coś jest iparzyste. Jeśli tak, pętla jest kontynuowana bez drukowania znaku nowej linii. Dane wyjściowe programu:
0 1
2 3
4 5
6 7
8 9
Podobnie jak w przypadku operatora break, continuemożna zdefiniować etykietę wskazującą, która pętla otaczająca ma być kontynuowana. Przykładowy program służący continuedo wydruku trójkątnej tabliczki mnożenia od 0 do 9.
// Использование continue с меткой.
public class ContinueLabel {

  public static void main(String[] args) {
    outer:
    for (int i = 0; i < 10; i++) {
      for (int j = 0; j < 10; j++) {
        if (j > i) {
          System.out.println();
          continue outer;
        }
        System.out.print(" " + (i * j));
      }
    }
    System.out.println();
  }
}
Instrukcja continuew tym przykładzie kończy ocenę pętli ji jest kontynuowana w następnej iteracji pętli sterowanej przez i. Dane wyjściowe z tego programu:
0
 0 1
 0 2 4
 0 3 6 9
 0 4 8 12 16
 0 5 10 15 20 25
 0 6 12 18 24 30 36
 0 7 14 21 28 35 42 49
 0 8 16 24 32 40 48 56 64
 0 9 18 27 36 45 54 63 72 81
Jest niezwykle rzadko przydatny continue. Jednym z powodów jest to, że Java udostępnia bogaty zestaw instrukcji zapętlających, które pasują do większości aplikacji. Jednakże w tych szczególnych sytuacjach, w których konieczne jest wcześniejsze zakończenie iteracji, instrukcja continuezapewnia ustrukturyzowany sposób wykonania tego zadania.

Operatorreturn

Ostatnią instrukcją sterującą jest return. Służy do jawnego powrotu z metody, to znaczy przekazuje kontrolę programu z powrotem do programu wywołującego. Operator returnjest klasyfikowany jako operator przejścia. Chociaż pełne omówienie musi poczekać do omówienia metod, tutaj przedstawiono krótki przegląd return. Operatora returnmożna użyć w dowolnym miejscu metody, aby wrócić do programu wywołującego metodę. Instrukcja returnnatychmiast kończy wykonywanie metody, w której się znajduje. Ilustruje to następujący przykład:
// Демонстрирует return.
public class Return {

  public static void main(String[] args) {
    boolean t = true;
    System.out.println("Перед оператором return.");
    if (t) {
      return; // возврат в вызывающую программу
    }
    System.out.println("Этот оператор никогда не выполнится.");
  }
}
To returnpowraca do systemu Java w czasie wykonywania, ponieważ to system wywołuje metodę main(). Dane wyjściowe z tego programu:
Перед оператором return.
Możesz zauważyć, że ostatnia instrukcja println()nie jest wykonywana. W momencie wykonania returnkontrola jest przekazywana z powrotem do programu wywołującego. Ostatnia uwaga. W poprzednim programie ifoperator (t) był konieczny. Bez tego kompilator Java wygenerowałby błąd „nieosiągalny kod”, ponieważ wiedziałby, że ostatnia instrukcja println()nigdy nie zostanie wykonana. Aby zapobiec temu błędowi, używany jest operator (t) if, który oszukuje kompilator na potrzeby tej demonstracji. Link do oryginalnego źródła: Operatory przejścia
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION