如果你给
public class test
{
public static void main(String ar[])
{
if (true)
int i=0;
}
}
它没有编译,但带括号的相同代码是:
public class test
{
public static void main(String ar[])
{
if (true)
{int i=0;}
}
}
解释是什么?
答案 0 :(得分:27)
变量声明基本上只能在块中声明。
查看Java语言规范中的grammar for "statement" - 它包括Block,但不包括LocalVariableDeclarationStatement - 后者是grammar for a block的一部分。
这实际上是一个实用主义的问题:如果你没有支具,你只能使用一个声明。如果没有后续语句,则声明变量没有意义,因为您不能使用该变量。你可能只有expression statement没有变量声明 - 并且是允许的。
这样可以防止出现以下错误:
if (someCondition)
int x = 0;
System.out.println(x);
乍一看可能看起来不错,但实际上相当于:
if (someCondition)
{
int x = 0;
}
System.out.println(x);
我个人总是使用大括号,因为它会让那种bug更难创建。 (我曾经被它咬了一次,发现有问题的代码真的很棘手。)
答案 1 :(得分:4)
由于你在if块中定义一个变量,你需要有括号。
但是下面的代码将使用编译器警告进行编译。
int i;
if(true)
i = 0;
答案 2 :(得分:2)
这是因为变量声明需要块上下文(它的生命周期范围),因此您需要括号(定义块)。