Witam wszystkich kolegów i osoby po prostu zainteresowane.
Dzisiaj przyjrzymy się takiej funkcji języka programowania Java, jak operator break. To pierwszy artykuł na temat operatorów przejść, więc jeśli Ci się spodoba, chętnie napiszę więcej. Od razu zaznaczę, że ten artykuł jest przeznaczony przede wszystkim dla początkujących programistów, a bardziej zaawansowani studenci mogą nie znaleźć tu nic nowego dla siebie. Więc chodźmy. W Javie istnieją dwa sposoby zmiany kolejności wykonywania instrukcji programu: instrukcje skoku i mechanizm obsługi wyjątków. W Javie są trzy operatory skoków: break, kontynuuj i return. Dziś zapraszam do bliższego przyjrzenia się operatorowi
break
. Obsługa wyjątków to tak szeroki temat, że wykracza poza zakres tego artykułu. Istnieją trzy sposoby użycia instrukcji break w Javie. Pierwszym i najpopularniejszym sposobem jest break
wcześniejsze wyjście z pętli, na przykład:
public class SimpleExample {
public static void main(String[] args) {
findNumberInLoop(3);
}
public static void findNumberInLoop(int number){
for (int i = 0; i < 10; i++) {
if (i == number) {
break;
}
System.out.println(i);
}
System.out.println("cycle was finished");
}
}
Ten przykład wyświetli:
1
2
cycle was finished
Oznacza to, że gdy licznik pętli i
zrówna się z przekazanym parametrem number
, czyli liczbą 3, wykonanie pętli zostanie wcześniej zakończone. Jeśli program ma kilka zagnieżdżonych pętli, odłącz wyjścia tylko od najbardziej wewnętrznej pętli, na przykład:
public class SimpleExample {
public static void main(String[] args) {
findNumberInLoop(3);
}
public static void findNumberInLoop(int number){
for(int i = 0; i < 5; i++) {
for (int j =0; j < 10; j++) {
if(j == number) {
break;
}
System.out.print(j);
}
System.out.println();
}
System.out.println("cycles was finished");
}
}
Ten przykład generuje dane wyjściowe:
012
012
012
012
012
cycles was finished
Jak widać na przykładzie pętla wewnętrzna jest przerywana każdorazowo przy liczbie 3 (parametr number
), a pętla zewnętrzna wykonywana jest 5 razy zgodnie z zamierzeniem. W Javie możesz użyć więcej niż jednej instrukcji break w pętli, ale nie jest to zalecane, ponieważ czytelność i struktura kodu są znacznie obniżone. Drugim zastosowaniem break
jest użycie go do przerwania wykonywania instrukcji w oddziałach switch
, na przykład:
public class SimpleExample {
public static void main(String[] args) {
square(2);
}
public static void square(int number){
switch (number){
case 1:
System.out.println(number*number);
break;
case 2:
System.out.println(number*number);
break;
case 3:
System.out.println(number*number);
break;
}
System.out.println("after switch");
}
}
Uruchomienie tego przykładu da wynik:
4
after switch
Instrukcja break przekazała kontrolę do kodu następującego po całym bloku switch
. break
Jeśli w switch
tym przykładzie nie określisz :
public class SimpleExample {
public static void main(String[] args) {
square(2);
}
public static void square(int number){
switch (number){
case 1:
System.out.println(number*number);
case 2:
System.out.println(number*number);
case 3:
System.out.println(number*number);
}
System.out.println("after switch");
}
}
Dane wyjściowe nie będą zgodne z oczekiwaniami:
4
4
after switch
Stało się tak, ponieważ po wykonaniu bloku case 2
program kontynuował wykonywanie wszystkich kolejnych bloków przypadków , co dało nam odpowiedni wynik. Czasami ta cecha operatora switch
może być dla nas korzystna, na przykład:
public class SimpleExample {
public static void main(String[] args) {
compare(2);
compare(7);
compare(12);
}
public static void compare(int number){
switch (number){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
System.out.println("number is less than 5 or equal 5");
break;
case 6:
case 7:
case 8:
case 9:
System.out.println("number is greater than 5");
break;
default:
System.out.println("number is less than 0 or greater than 9");
}
System.out.println("after switch");
}
}
Ten program porównuje daną liczbę z liczbą 5 i daje następujący wynik:
after switch
number is greater than 5
after switch
number is less than 0 or greater than 9
after switch
Kiedy metoda jest wywoływana po raz pierwszy, operator switch
przekazuje kontrolę operatorowi case 2
, a następnie operatorowi break
w case 5
. Drugie wywołanie jest podobne do pierwszego, ale zaczyna się od c case 7
. Trzecie wywołanie nie znajdzie odpowiedniej wartości wśród wszystkich przypadków, więc operator zostanie wykonany default
. Trzeci sposób to użycie operatora break
zamiast goto
operatora C. W tym celu użyjemy specjalnej formy operatora break
wywoływanej break
z etykietą. Formularz ten wygląda jak break метка;
Etykieta — jest to zwykle dowolna odpowiednia nazwa z przestrzeni nazw Java, poprzedzająca blok kodu. Co więcej, po zastosowaniu tego bloku kodu break
z etykietą, kod będzie w dalszym ciągu wykonywany od miejsca za blokiem z odpowiednią etykietą, np.:
public class SimpleExample {
public static void main(String[] args) {
howWeUseLabels(true);
System.out.println();
howWeUseLabels(false);
}
public static void howWeUseLabels(boolean bool) {
firstBlock:{
secondBlock:{
thirdBlock:{
System.out.println("We will see it always");
if(bool) {
break secondBlock;
}
System.out.println("We won't see it if bool == true");
}
System.out.println("We won't see it if bool == true");
}
System.out.println("We will see it always");
}
}
}
Ten przykład da następujące dane wyjściowe:
We will see it always
We will see it always
We will see it always
We won't see it if bool == true
We won't see it if bool == true
We will see it always
Po pierwszym wywołaniu metody operator break
przekazuje kontrolę na koniec bloku secondBlock
, wychodząc secondBlock
i thirdBlock
, wykonując jednocześnie inny operator println()
na końcu firstBlock
. Po drugim połączeniu na ekranie zostaną wyświetlone wszystkie linie. Etykiet można również używać do oznaczania cykli. Należy pamiętać, że do etykiety można przejść jedynie z wnętrza wskazanego przez etykietę bloku kodu; przykładowo taki kod się nie skompiluje:
public class SimpleExample {
public static void main(String[] args) {
label:{
System.out.println("inside label");
}
if(true) {
break label;
}
System.out.println("This is error");
}
}
Uwagi na temat czystości kodu i instrukcji break
: Ogólnie przyjmuje się, że instrukcja powinna być używana break
bardzo ostrożnie, ponieważ break
utrudnia to zrozumienie pętli i zmusza programistę do zajrzenia do wnętrza pętli w celu zrozumienia niuansów jej działania. Istnieje zasada heurystyczna, której break
możesz używać z większą pewnością w krótszych pętlach i z większą ostrożnością w długich i głęboko zagnieżdżonych pętlach, ponieważ zwiększa to prawdopodobieństwo błędów i komplikuje czytanie i zrozumienie Twojego kodu przez innych programistów. Jak pisałem powyżej, użycie dużej liczby break
.rozsianych po całym kodzie wskazuje, że programista nie do końca rozumie, dlaczego napisał swój kod w taki sposób, w jaki to zrobił. Warto rozważyć refaktoryzację takiej pętli poprzez podzielenie jej na kilka mniejszych pętli. Staraj się zachować ostrożność, używając break
etykiety jako zamiennika goto
, ponieważ komplikuje to strukturę kodu. To wszystko, co chciałem dzisiaj powiedzieć o operatorze break
w Javie. Chętnie przyjmę konstruktywną krytykę, jestem też gotowy napisać kontynuację na temat operatorów continue
i return
, jeśli jesteś zainteresowany.
GO TO FULL VERSION