在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节,如果定义为:
IfThenStatement:
if ( Expression ) Statement
语句定义为(14.5)
Statement:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
StatementWithoutTrailingSubstatement:
Block
EmptyStatement
ExpressionStatement
AssertStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
ThrowStatement
TryStatement
因此,使用块,表达式语句或空语句就可以了。 但是声明(在第6章中定义)不在声明的语法中。