"Loop:" im Java-Code. Was ist das und warum wird es kompiliert?

112

Dieser Code hat mich nur ein paar Minuten lang auf meinen Bildschirm starren lassen:

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

( Zeile 137 hier )

Ich habe das noch nie gesehen und hatte keine Ahnung, dass Java ein "Schleifen" -Schlüsselwort hat (NetBeans färbt es nicht einmal wie ein Schlüsselwort), und es lässt sich gut mit JDK 6 kompilieren.

Was ist die Erklärung?

Amy B.
quelle

Antworten:

204

Es ist kein keywordes ist ein label.

Verwendung:

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

Dokumentation .

Jigar Joshi
quelle
19
Erwähnenswert ist, dass das OP mit dem goto / label-Konzept möglicherweise nicht vertraut ist und dass es im Allgemeinen als schlechte Praxis angesehen wird, außer in ganz bestimmten Situationen (z. B. zum Verknüpfen mehrerer verschachtelter Schleifen).
Haylem
10
@ Haylem stimmt, aber ich würde noch weiter gehen: Mehrere verschachtelte Schleifen sind normalerweise auch eine schlechte Praxis. Wann immer ich Loop-Labels verwendete, überarbeitete ich den Code schließlich, sodass ich sie nicht brauchte. Es gibt immer einen besseren Weg.
Sean Patrick Floyd
73

Wie andere Plakate gesagt haben, handelt es sich um ein Etikett, nicht um ein Schlüsselwort. Mit Etiketten können Sie Folgendes tun:

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

Dies ermöglicht das Brechen der äußeren Schleife.

Link zur Dokumentation .

Rob Di Marco
quelle
31

Die Frage wird beantwortet, aber als Randnotiz:

Ich habe von Interviewfragen a la "Warum ist dieser Java-Code gültig?" Gehört. (streifte das einfachere Beispiel ab; hier ist das gemeinere, danke Tim Büthe):

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

Würdet ihr alle wissen, was dieser Code ist (abgesehen von schrecklich)?

Lösung: zwei Beschriftungen urlund http, ein Kommentar www.myserver.com/myfile.mp3und ein Methodenaufruf mit einem Parameter, der denselben Namen ( url) wie die Beschriftung hat. Ja, dies wird kompiliert (wenn Sie den Methodenaufruf und die lokale Variable an anderer Stelle definieren).

Sean Patrick Floyd
quelle
Zu Ihrer Information, Sie brauchen die Schleife nicht, a; in der nächsten Zeile ist genug
Tim Büthe
Vielen Dank, dass Sie mich daran erinnert haben. Ich glaube, die Frage enthielt keine Schleifen. Ich werde meine Antwort bearbeiten (mir wurde diese Frage nie gestellt, aber der Interviewer war ein ehemaliger Kollege von mir)
Sean Patrick Floyd
16

Das ist kein Schlüsselwort, es ist ein Label. Es soll mit den Schlüsselwörtern breakund continuein verschachtelten Schleifen verwendet werden:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}
Michael Borgwardt
quelle
innerEtikett ist hier nutzlos, break;ist genug
Gertas
12
Wenn es zwei Möglichkeiten gibt, die Schleife zu durchbrechen, schätze ich das innerEtikett aus Gründen der Klarheit.
Steve Jackson
1
@gertas: Ich denke, er demonstriert nur den Punkt. Aber laut Steve Jackson könnte es eine gute Idee sein, es trotzdem zur Selbstdokumentation zu sagen.
Jay
5

Es ist kein Schlüsselwort; Es ist ein Etikett .

Es ermöglicht Ihnen, eine beschriftete breakund beschriftete zu gehen continue.

Codaddict
quelle
4

Dies ist wirklich eine Antwort auf den Kommentar von Seanizer zur Antwort von org.life.java, aber ich wollte Code einfügen, damit ich die Kommentarfunktion nicht verwenden konnte.

Es ist zwar sehr selten, dass ich eine Verwendung für "break label" finde, aber es kommt gelegentlich vor. Der häufigste Fall ist, wenn ich nach etwas suche, das sich in einer Struktur befindet, für deren Suche eine verschachtelte Schleife erforderlich ist, z.

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

Normalerweise schiebe ich in solchen Fällen das Ganze in eine Unterroutine, damit ich bei einem Treffer das gefundene Objekt zurückgeben kann. Wenn es am Ende der Schleife herausfällt, kann ich null zurückgeben, um ein nicht gefundenes anzuzeigen, oder vielleicht eine Ausnahme auslösen. Dies ist jedoch gelegentlich nützlich.

Ehrlich gesagt denke ich, dass die Erfinder von Java diese Funktion aufgenommen haben, weil sie zwischen dieser und der Ausnahmebehandlung die letzten beiden legitimen Verwendungen für GOTO eliminiert haben.

Sehr später Nachtrag:

Ich habe einmal eine tolle Codezeile gesehen. Der Programmierer schrieb:

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

Er sagte eigentlich nicht "example.com", sondern die Website unseres Unternehmens.

Es entsteht der Eindruck, dass der Code eine URL enthält. Es wird erfolgreich kompiliert, als würde es etwas tun. Aber ... was macht es?

In Wirklichkeit macht es nichts. "http:" ist ein Label, auf das er nie verweist. Dann macht das "//" den Rest der Zeile zu einem Kommentar.

Jay
quelle
4

Es handelt sich um eine Haltepunktbezeichnung, mit der Sie aus einer bestimmten Schleife ausbrechen können und nicht nur aus der innersten, in der Sie sich gerade befinden.

Es wird in Zeile 148 verwendet .

PaulJWilliams
quelle
2

Man könnte fast alles schreiben, da es ein Etikett ist ... Sie haben ein Beispiel hier

SoulWanderer
quelle
2

Es ist ein Etikett, sehen Sie sich jedoch das folgende Beispiel an:

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

Wenn b>10der Ausführungsfluss zur äußeren Schleife geht.

Alberto Zaccagni
quelle
1

Es ist ein Label, und Labels in Java können mit den Schlüsselwörtern breakund continuefür zusätzliche Kontrolle über Schleifen verwendet werden.

Hier wird es ziemlich gut erklärt:

Denken Sie in Java, brechen Sie und fahren Sie fort

vstoyanov
quelle
1

Es ist kein Schlüsselwort, sondern eine Bezeichnung . Wenn Sie sich in der forSchleife befinden, schreiben break loop;Sie und verlassen diese Schleife.

greuze
quelle
0

Es ist ein Etikett. Im Allgemeinen wird in Java eine Bezeichnung verwendet, um den Kontrollfluss am gewünschten Speicherort zu übertragen, während für alle Schlüsselwörter, z. B. "Weiter" und "Unterbrechen", eine bestimmte Speicherortauswahl festgelegt ist.

RTA
quelle