public class Foo{
public static void main(String []args){
int a=10;
if(a==10)
int x=20;
}
}
在编译上面的代码时,编译时会抛出错误。
但是,在下面的代码中它很好。为什么呢?
public class Foo{
public static void main(String []args){
int a=10;
if(a==10){
int x=20;
}
}
}
我不明白。这些究竟发生了什么?据我所知,我们可以在没有花括号的if语句之后编写一个语句(复合语句块)。
答案 0 :(得分:13)
为清楚起见,问题在于:
if(a==10)
int x=20;
...错误为error: variable declaration not allowed here
。
这是不允许的,因为在if
之后有一个特定的语句列表;它们在JLS§14.5中有详细说明:
StatementWithoutTrailingSubstatement
LabeledStatement
IfThenStatement
IfThenElseStatement
WhileStatement
ForStatement
StatementWithoutTrailingSubstatement
(上面的第一件事)包括:
Block
EmptyStatement
ExpressionStatement
AssertStatement
SwitchStatement
DoStatement
BreakStatement
ContinueStatement
ReturnStatement
SynchronizedStatement
ThrowStatement
TryStatement
请注意,LocalVariableDeclarationStatement
不会出现在该列表中。虽然Block
允许LocalVariableDeclarationStatement
,但您的第二个例子没问题。
为什么 不会出现在列表中?推测为什么语言设计师会做他们所做的事情总是很危险的。但是到底是什么:让我们说他们允许了。这是什么意思?它仅限于if
的身体吗?那有点无意义,不是吗?除了初始化的副作用(例如int x = foo();
)之外,它们没有任何效果,在这种情况下,你应该只编写引起副作用的事物(foo();
)。如果不作用于if
的主体(它最终在包含的范围内),这是相当混乱的,不是吗?除非if
的条件为真,否则看起来就像它不会被声明一样......
答案 1 :(得分:0)
好的,首先要始终格式化您的代码,以便更容易阅读。
我从未尝试过这个。但这绝对没有意义。 int x=20
是死代码,如果没有{},则只允许一个命令。因此,在这一个命令中定义一个变量,紧接其后再次未定义,因为剩下'if'的上下文。 'x'仅在'if'
public class Foo {
public static void main(String []args){
int a=10;
if(a==10)
int x=20;
}
}
我猜这个死代码被编译器看作是绝对错误和无意的。
您的其他示例是相同的,但编译器没有注意到它。