2015-06-03 8 views
8

Se guardiamo il Java standard §14.7, vediamo che le dichiarazioni possono avere prefissi di etichette, ad esempio:Java etichetta irregolarità (? Possibile bug)

LabeledStatement:

Identifier: Dichiarazione

In teoria, un'etichetta dovrebbe essere in grado di etichettare qualsiasi dichiarazione successiva. Così, per esempio, il seguente compila conseguenza:

public class Test { 
    public static void main(String[] args) { 
    hello: 
     return; 
    } 

} 

Intuitivamente, questo compila anche:

public class Test { 
    int i; 
    public static void main(String[] args) { 
     Test t = new Test(); 
    label: 
     t.i = 2;   
    } 
} 

Ma il seguente fa non di compilazione:

public class Test { 
    public static void main(String[] args) { 
    oops: 
     int k = 3; 
    } 
} 

Anche se questo non fa (notare le parentesi):

public class Test { 
    public static void main(String[] args) { 
    oops: 
     { 
      int k = 3; 
     } 
    } 
} 

Quindi la domanda dipende dal fatto che le dichiarazioni siano o meno dichiarazioni. In base allo standard (e allo online documentation):

In aggiunta alle istruzioni di espressione, esistono altri due tipi di istruzioni: dichiarazioni di dichiarazione e istruzioni di flusso di controllo. Una dichiarazione dichiara una variabile.

Ho notato questo comportamento in Java 7 e 8 sia su OSX che su Windows. È un errore o sto fraintendendo lo standard?

+0

Interessante. Quale messaggio di errore fornisce il compilatore? – Thilo

risposta

8

L'espressione

int k = 3; 

è un local variable declaration statement.

Il statement utilizzato nella sintassi di una dichiarazione un'etichetta

LabeledStatement:

Identifier: Statement

non contiene istruzioni di dichiarazione delle variabili locali. Pertanto, non è possibile utilizzarli direttamente in una dichiarazione etichettata.

Le dichiarazioni di dichiarazione delle variabili locali possono essere utilizzate entro blocks che possono essere utilizzate all'interno di istruzioni etichettate.