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

siv*_*iva 10 java

如果你给

    public class test
    {
        public static void main(String ar[])
        {
            if (true)
                int i=0;
        }
    }
Run Code Online (Sandbox Code Playgroud)

它不是编译,但带括号的相同代码是:

    public class test
    {
        public static void main(String ar[])
        {
            if (true)
                {int i=0;}
        }
    }
Run Code Online (Sandbox Code Playgroud)

解释是什么?

Jon*_*eet 27

变量声明基本上只能在块中声明.

查看 Java语言规范中"语句"语法 - 它包括Block,但不包括LocalVariableDeclarationStatement - 后者是块语法的一部分.

这实际上是一个实用主义问题:如果你没有支撑,你只能使用一个声明.如果没有后续语句,则声明变量没有意义,因为您无法使用该变量.你可能只有一个没有变量声明的表达式语句 - 这允许的.

这可以防止错误,例如:

if (someCondition)
    int x = 0;
    System.out.println(x);
Run Code Online (Sandbox Code Playgroud)

乍一看可能看起来不错,但实际上相当于:

if (someCondition)
{
    int x = 0;
}
System.out.println(x);
Run Code Online (Sandbox Code Playgroud)

就个人而言,无论如何我总是使用大括号,因为它会使这种类型的bug更难创建.(我曾经被它咬过一次,发现有问题的代码真的很棘手.)