2010-09-29 10 views
91

Questo codice appena fatto mi guardo il mio schermo per qualche minuto:"loop:" nel codice Java. Cos'è questo, perché lo compila?

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

(line 137 here)

non ho mai visto prima, e non avevo idea di Java ha una parola chiave "loop" (Netbeans non lo colora nemmeno come una parola chiave), e si compila bene con JDK 6.

Qualcuno può spiegarmi questo?

+7

* Questo codice mi ha fatto fissare il mio schermo per alcuni minuti * - hahahahahahha ... stato lì, fatto così :) – luigi7up

risposta

167

Non è un keyword è un label.

Usage:

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

Documentation.

+1

@Coronatus: dovresti accettare la sua risposta se ti ha aiutato. ;) –

+17

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 la scorciatoia di più cicli annidati). – haylem

+0

@haylem yeah true –

4

Non è una parola chiave, è una label.

Permette di andare in pausa etichettati ed etichettati continua.

4

sua un'etichetta punto di rottura, per consentire di uscire da un ciclo specifico, piuttosto che semplicemente quello più interno vi capita di essere in.

sua utilizzati su line 148

69

Come altri hanno detto, è un'etichetta, non una parola chiave. L'utilizzo di etichette consente di eseguire operazioni come

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

Ciò consente la rottura del ciclo esterno.

EDIT: Con link to documentation

+0

Avrei votato se avessi incluso lo stesso link che org.life.java ha fatto. – DJClayworth

2

E 'un marchio, anche se cerca nella seguente esempio:

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

Quando b>10 flusso dell'esecuzione va al ciclo esterno

16

che non è una parola chiave, è un'etichetta. E 'pensato per essere utilizzato con i break e continue parole chiave all'interno di cicli nidificati:

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

anche +1 per l'uso pratico! – f1sh

+0

L'etichetta 'inner' è inutile qui,' break; 'è sufficiente – gertas

+12

Se ci sono due modi per interrompere il ciclo, apprezzo l'etichetta' inner' per chiarezza. –

2

si potrebbe scrivere quasi nulla, in quanto è un marchio ... Hai un esempio here

1

Non è un parola chiave, ma un'etichetta .Se all'interno del ciclo for si scrive break loop;, si esce quel ciclo

29

La domanda si risponde, ma come nota a margine:

ho sentito parlare di domande dell'intervista a la "Perché questo è il codice Java valida" (messo a nudo l'esempio più semplice, ecco il più cattivo uno, thx Tim Buthe):

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

Vuoi tutti sappiamo ciò che questo codice è (a parte terribile)?

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

+0

Perchè non ti serve il ciclo, a; nella riga successiva è sufficiente –

+0

Grazie per avermelo ricordato, penso che non ci fossero loop nella domanda. Modificherò la mia risposta (non ho mai fatto questa domanda ma l'intervistatore era un mio ex collega) –

3

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.

Mentre è molto raro che trovo un uso per "etichetta pausa", succede occasionalmente. Il caso più comune è quando io sto cercando qualcosa che è in una struttura che richiede un ciclo nidificato 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 ho può restituire l'oggetto trovato, e se cade dal fondo del ciclo posso restituire null per indicare un non trovato, o magari lanciare un'eccezione. Ma questo è occasionalmente utile.

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

Molto tardi addendum:

ho visto una grande linea gag del codice di una volta. 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. Compila con successo, come fa qualcosa. Ma che cosa fa?

In realtà non fa nulla. "http:" è un'etichetta che non fa mai riferimento. Quindi "//" rende il resto della linea un commento.

0

è un'etichetta. etichetta generica utilizzata in java per trasferire il flusso di controllo nella posizione desiderata mentre tutte le parole chiave come continue, break hanno un chice di posizione specificato.

Problemi correlati