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?
Interessante. Quale messaggio di errore fornisce il compilatore? – Thilo