Java obsługuje trzy operatory skoku Korzystanie z operatora
Operator Użyj
Oprócz tego, że jest używany w instrukcjach switch i pętlach, Korzystanie z operatora
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 Operator
Ostatnią instrukcją sterującą jest
break
- continue
i return
. Przenoszą kontrolę do innej części programu. Rozważmy szczegółowo każdego z operatorów.
Korzystanie z operatorabreak
Operator break
w 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. break
Kiedy 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 for
została tutaj zaprojektowana tak, aby wykonywać swoje instrukcje od 0 do 99 razy, operator break
powoduje jej wcześniejsze zakończenie, gdy i wynosi 4. Operatora break
moż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 break
wyjdzie 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 break
w 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ę - switch
wpływa tylko na instrukcję - switch
(a nie na pętle ją zawierające). Komentarz: Break
nie został zaprojektowany jako normalny sposób zakończenia pętli. Do tego celu służy wyrażenie warunkowe nagłówka pętli. Operatora break
należy używać do przerywania pętli tylko wtedy, gdy zaistnieją pewne szczególne sytuacje.
Użyj break
jako formularzagoto
Oprócz tego, że jest używany w instrukcjach switch i pętlach, break
może być również używany samodzielnie jako „cywilizowana” forma pliku goto
. Java nie zawiera operatora, goto
ponieważ wykonuje rozgałęzienie w sposób dowolny i nieustrukturyzowany. Kod, który intensywnie używa ., goto
jest zazwyczaj trudny do zrozumienia i utrzymania. Zastępuje także niektóre optymalizacje kompilatora. Istnieje jednak kilka miejsc w programie, w których goto
przepływ kontroli jest cenną i uzasadnioną konstrukcją. Może to być na przykład goto
przydatne 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 break
współpracuje ze znakiem i zapewnia korzyści goto
, omijając jego problemy. Instrukcja break
oznaczona etykietą ma następującą ogólną postać: break label;
Oto label
nazwa etykiety identyfikującej jakiś blok kodu. Kiedy ten formularz break
jest 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. break
moż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, break
aby uciec ze zbioru zagnieżdżonych bloków. Ale nie można użyć break
bloku 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 break
przesuwa 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 break
jest 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 goto
przejście od kolejnych operacji na treści do końca bloku pętli. Czynność tę wykonuje operator continue
. W pętlach operator while
and 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 while
continue
for
for
continue
// Демонстрирует 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 i
parzyste. 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
, continue
można zdefiniować etykietę wskazującą, która pętla otaczająca ma być kontynuowana. Przykładowy program służący continue
do 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 continue
w tym przykładzie kończy ocenę pętli j
i 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 continue
zapewnia 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 return
jest klasyfikowany jako operator przejścia. Chociaż pełne omówienie musi poczekać do omówienia metod, tutaj przedstawiono krótki przegląd return
. Operatora return
można użyć w dowolnym miejscu metody, aby wrócić do programu wywołującego metodę. Instrukcja return
natychmiast 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 return
powraca 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 return
kontrola jest przekazywana z powrotem do programu wywołującego. Ostatnia uwaga. W poprzednim programie if
operator (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
GO TO FULL VERSION