为什么这不是用Java编译的?

时间:2009-12-29 13:28:32

标签: java

如果你给

    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;}
        }
    }

解释是什么?

3 个答案:

答案 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)

这是因为变量声明需要块上下文(它的生命周期范围),因此您需要括号(定义块)。