在Java中,任何时候你遇到一对
{}
,你都可以创建一个新的作用域。
考虑以下示例:
class ScopeTest {
public static void main(String[] args) {
int i = 0;
{ int j = 0; System.out.println(j); }
{ int j = 2; System.out.println(j); }
}
}
try/catch遵循这种习惯用法,并强制创建一对{ }
。
为了回答您后续的非括号if语句,请考虑:
class MultiRTree {
public static void main(String...args) {
boolean b = args.length == 0;
if(b) String s = new String("hello");
}
}
造成
c:\files\j>javac ScopeTest.java
ScopeTest.java:4: not a statement
if(b) String s = new String("hello");
^
ScopeTest.java:4: ';' expected
if(b) String s = new String("hello");
^
2 errors
然而,这将可以正常编译。
class ScopeTest {
public static void main(String...args) {
boolean b = args.length == 0;
if(b) new String("hello");
}
}
根据JLS第14章第9节,if被定义为“为了控制语句的执行,如果指定一个布尔表达式作为它的条件,则该布尔表达式必须首先进行求值。”
IfThenStatement:
if ( Expression ) Statement
And Statement是指(14.5)。
Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
StatementWithoutTrailingSubstatement:
Block
EmptyStatement
ExpressionStatement
AssertStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
ThrowStatement
TryStatement
因此,块、表达式语句或空语句都是可以的。但是声明(在第6章中定义)不在语句的语法中。