"Loop:" nel codice Java. Cos'è questo e perché viene compilato?


113

Questo codice mi ha fatto fissare il mio schermo per alcuni minuti:

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

( riga 137 qui )

Non l'ho mai visto prima, e non avevo idea che Java avesse una parola chiave "loop" (NetBeans non la colora nemmeno come una parola chiave) e si compila bene con JDK 6.

Qual è la spiegazione?

Risposte:


205

Non è un keywordè un label.

Uso:

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

Documentazione .


19
Vale la pena ricordare, poiché l'OP potrebbe non avere familiarità con il concetto goto / label, che è generalmente considerato una cattiva pratica, tranne in situazioni molto particolari (ad esempio, per abbreviare più cicli annidati).
haylem

10
@haylem vero, ma vorrei andare oltre: anche più cicli annidati di solito sono una cattiva pratica. Ogni volta che ho usato le etichette di loop, ho eventualmente rifattorizzato il codice in modo che non ne avessi bisogno. C'è sempre un modo migliore di quello.
Sean Patrick Floyd,

73

Come hanno detto altri poster, è un'etichetta, non una parola chiave. L'uso delle etichette ti consente di fare cose come:

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

Ciò consente la rottura del ciclo esterno.

Link alla documentazione .


31

La domanda ha una risposta, ma come nota a margine:

Ho sentito parlare di domande di intervista alla "Perché questo codice Java è valido?" (spogliato l'esempio più semplice; ecco quello più cattivo, grazie a Tim Büthe):

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

Sapreste tutti cos'è questo codice (a parte terribile)?

Soluzione: due etichette urle http, un commento www.myserver.com/myfile.mp3e una chiamata al metodo con un parametro che ha lo stesso nome ( url) dell'etichetta. Sì, questo viene compilato (se si definisce la chiamata al metodo e la variabile locale altrove).


Cordiali saluti, non hai bisogno del ciclo, a; nella riga successiva è sufficiente
Tim Büthe

Grazie per avermelo ricordato, penso che non ci fossero loop nella domanda. Modificherò la mia risposta (non mi è mai stata posta questa domanda ma l'intervistatore era un mio ex collega)
Sean Patrick Floyd,

16

Non è una parola chiave, è un'etichetta. È pensato per essere utilizzato con le parole chiave breake continueall'interno di cicli nidificati:

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

innerl'etichetta qui è inutile, break;è sufficiente
gertas

12
Se ci sono due modi per interrompere il ciclo, apprezzo la innerchiarezza dell'etichetta.
Steve Jackson,

1
@gertas: Penso che stia solo dimostrando il punto. Ma secondo Steve Jackson, potrebbe essere una buona idea dirlo comunque per scopi di auto-documentazione.
Jay,


4

Questa è davvero una risposta al commento di seanizer sulla risposta di org.life.java, ma volevo inserire del codice in modo da non poter utilizzare la funzione di commento.

Sebbene sia molto raro trovare un uso per "break label", accade occasionalmente. Il caso più comune è quando cerco qualcosa che si trova in una struttura che richiede un ciclo annidato per la ricerca, come:

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

Di solito in questi casi spingo il tutto in una subroutine in modo che su un colpo possa restituire l'oggetto trovato, e se cade dal fondo del ciclo posso restituire null per indicare un non trovato, o forse lanciare un'eccezione. Ma questo è occasionalmente utile.

Francamente, penso che gli inventori di Java abbiano incluso questa funzionalità perché tra questa e la gestione delle eccezioni, hanno eliminato gli ultimi due usi legittimi per GOTO.

Addendum molto tardivo:

Una volta ho visto una fantastica riga di codice. Il programmatore ha scritto:

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

In realtà non ha detto "esempio.com" ma il sito web della nostra azienda.

Dà l'impressione che ci sia un URL nel codice. Si compila correttamente, come se facesse qualcosa. Ma che cosa fa?

In realtà non fa niente. "http:" è un'etichetta a cui non fa mai riferimento. Quindi "//" rende il resto della riga un commento.


4

È un'etichetta del punto di interruzione, che ti consente di uscire da un ciclo specificato, piuttosto che semplicemente quello più interno in cui ti trovi.

È utilizzato sulla linea 148 .



2

È un'etichetta, anche se guarda il seguente esempio:

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

Quando b>10il flusso di esecuzione passa al ciclo esterno.



1

Non è una parola chiave, ma un'etichetta . Se all'interno del forciclo scrivi break loop;e esci da quel ciclo.


0

È un'etichetta. Generalmente un'etichetta utilizzata in Java per trasferire il flusso di controllo nella posizione desiderata mentre tutte le parole chiave, come continue e interrompi, hanno una scelta di posizione specifica.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.