„Loop:” w kodzie Java. Co to jest i dlaczego się kompiluje?


113

Ten kod sprawił, że przez kilka minut patrzyłem na ekran:

loop:
for (;;) {
    // ...
}

( wiersz 137 tutaj )

Nigdy wcześniej tego nie widziałem i nie miałem pojęcia, że ​​Java ma słowo kluczowe „loop” (NetBeans nawet nie koloruje go jak słowa kluczowego) i dobrze się kompiluje z JDK 6.

Jakie jest wyjaśnienie?

Odpowiedzi:


205

To nie jest keywordto jest label.

Stosowanie:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }

Dokumentacja .


19
Warto wspomnieć, ponieważ OP może nie znać koncepcji goto / label, że jest to ogólnie uważane za złą praktykę, z wyjątkiem bardzo szczególnych sytuacji (na przykład do skracania wielu zagnieżdżonych pętli).
haylem

10
@haylem prawda, ale poszedłbym dalej: wiele zagnieżdżonych pętli też jest zazwyczaj złą praktyką. Za każdym razem, gdy korzystałem z etykiet pętli, w końcu zmieniałem kod, więc ich nie potrzebowałem. Zawsze jest lepszy sposób niż to.
Sean Patrick Floyd

73

Jak powiedziały inne plakaty, jest to etykieta, a nie słowo kluczowe. Używanie etykiet umożliwia wykonywanie takich czynności jak:

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}

Pozwala to na przerwanie zewnętrznej pętli.

Link do dokumentacji .


31

Na pytanie udzielono odpowiedzi, ale na marginesie:

Słyszałem o pytaniach wywiadowczych a la „Dlaczego ten kod Java jest ważny?” (usunięto prostszy przykład; oto mniejszy, dzięki Tim Büthe):

url: http://www.myserver.com/myfile.mp3
downLoad(url);

Czy wszyscy wiedzielibyście, co to za kod (poza okropnym)?

Rozwiązanie: dwie etykiety urloraz httpkomentarz www.myserver.com/myfile.mp3i wywołanie metody z parametrem, który ma taką samą nazwę ( url) jak etykieta. Tak, to się kompiluje (jeśli zdefiniujesz wywołanie metody i zmienną lokalną w innym miejscu).


FYI nie potrzebujesz pętli, a; w następnej linii wystarczy
Tim Büthe

Dzięki za przypomnienie, myślę, że w pytaniu nie było pętli. Zmienię odpowiedź (nigdy nie zadano mi tego pytania, ale ankieter był moim byłym kolegą)
Sean Patrick Floyd

16

To nie jest słowo kluczowe, to etykieta. Ma być używany ze słowami kluczowymi breaki continuewewnątrz zagnieżdżonych pętli:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}

inneretykieta jest tutaj bezużyteczna, break;wystarczy
gertas

12
Jeśli istnieją dwa sposoby na przerwanie pętli, doceniam inneretykietę za przejrzystość.
Steve Jackson

1
@gertas: Myślę, że po prostu demonstruje punkt. Ale według Steve'a Jacksona dobrym pomysłem może być powiedzenie tego dla celów autodokumentacji.
Jay


4

To jest naprawdę odpowiedź na komentarz seanizera na temat odpowiedzi org.life.java, ale chciałem wprowadzić jakiś kod, więc nie mogłem skorzystać z funkcji komentarza.

Chociaż bardzo rzadko znajduję zastosowanie określenia „break label”, zdarza się to sporadycznie. Najczęstszym przypadkiem jest wyszukiwanie czegoś, co znajduje się w strukturze wymagającej zagnieżdżonej pętli do wyszukiwania, na przykład:

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

Zwykle w takich przypadkach wsuwam całość do podprogramu tak, że po trafieniu mogę zwrócić znaleziony obiekt, a jeśli wypadnie z dolnej części pętli, mogę zwrócić wartość null, aby wskazać nie znaleziono, lub może wyrzucić wyjątek. Ale czasami jest to przydatne.

Szczerze mówiąc, myślę, że wynalazcy Javy włączyli tę funkcję, ponieważ między tym a obsługą wyjątków wyeliminowali dwa ostatnie legalne zastosowania GOTO.

Dodatek bardzo późny:

Widziałem kiedyś świetną linię kodu gagów. Programista napisał:

http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)

W rzeczywistości nie powiedział „example.com”, ale witryna internetowa naszej firmy.

Sprawia wrażenie, że w kodzie znajduje się adres URL. Kompiluje się pomyślnie, jakby coś robił. Ale ... co to robi?

W rzeczywistości nic nie robi. „http:” to etykieta, do której nigdy się nie odwołuje. Następnie „//” zmienia pozostałą część wiersza w komentarz.


4

Jest to etykieta punktu przerwania, umożliwiająca wyrwanie się z określonej pętli, a nie po prostu najbardziej wewnętrznej, w której akurat się znajdujesz.

Jest używany w linii 148 .



2

To etykieta, ale spójrz na następujący przykład:

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }

Gdy b>10przepływ wykonania przechodzi do zewnętrznej pętli.



1

To nie jest słowo kluczowe, ale etykieta . Jeśli fornapiszesz wewnątrz pętli break loop;i wyjdziesz z tej pętli.


0

To jest etykieta. Zwykle etykieta używana w Javie do przesyłania przepływu sterowania do żądanej lokalizacji, podczas gdy wszystkie słowa kluczowe, takie jak continue i break, mają określony wybór lokalizacji.

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.