If we look at the Java standard §14.7, we see that statements may have label prefixes, e.g.:
LabeledStatement:
Identifier : Statement
In theory, a label should be able to label any succeeding statement. So, for example, the following compiles accordingly:
public class Test {
public static void main(String[] args) {
hello:
return;
}
}
Intuitively, this also compiles:
public class Test {
int i;
public static void main(String[] args) {
Test t = new Test();
label:
t.i = 2;
}
}
But the following does not compile:
public class Test {
public static void main(String[] args) {
oops:
int k = 3;
}
}
Even though this does (note the scoped brackets):
public class Test {
public static void main(String[] args) {
oops:
{
int k = 3;
}
}
}
So the question hinges on whether or not declarations are statements. According to the standard (and the online documentation):
In addition to expression statements, there are two other kinds of statements: declaration statements and control flow statements. A declaration statement declares a variable.
I've noticed this behavior in Java 7 and 8 on both OSX as well as Windows. Is this a bug or am I misunderstanding the standard?
The expression
int k = 3;
is a local variable declaration statement.
The statement
used in the syntax of a label statement
LabeledStatement
:
Identifier
:Statement
does not contain local variable declaration statements. You therefore can't use them within a labeled statement directly.
Local variable declaration statements can be used within blocks which can be used within labeled statements.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With