为什么这不是用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;} } } 

解释是什么?

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

查看 Java语言规范中“语句”的语法 – 它包括Block,但不包括LocalVariableDeclarationStatement – 后者是块语法的一部分。

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

这可以防止错误,例如:

 if (someCondition) int x = 0; System.out.println(x); 

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

 if (someCondition) { int x = 0; } System.out.println(x); 

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

由于您在if块中定义变量,因此需要使用括号。

但是下面的代码将使用编译器警告进行编译。

 int i; if(true) i = 0; 

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