6
public class Test{
   public void newMethod(){

      if(true)int i=0;

   }
}

上面的代码给了我以下错误

Test.java:4: error: '.class' expected
      if(true)int i=0;
                  ^

但是如果我这样写

public class Test{
   public void newMethod(){

      if(true){
         int i=0;
      }

   }
}

那么就没有错误了!

我知道这个问题对社区没有帮助,但我真的很好奇为什么我需要在这个声明中加上括号。我用java编程已经有几年了,我现在才遇到这个错误。

顺便说一句,我正在使用 JGrasp。

4

2 回答 2

7

这是我的理解。引用JAVA SE 7 规范的第 14 章

14.2. 块

块是一系列语句、局部类声明和大括号内的局部变量声明语句。

Block:
    { BlockStatementsopt }

........     

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement

所以一个块总是在花括号中{ ... }

14.4. 局部变量声明语句

局部变量声明语句声明一个或多个局部变量名称。

LocalVariableDeclarationStatement:
    LocalVariableDeclaration ;

LocalVariableDeclaration:
    VariableModifiersopt Type VariableDeclarators

.......

VariableDeclarator:
    VariableDeclaratorId
    VariableDeclaratorId = VariableInitializer

…………

每个局部变量声明语句都立即包含在一个块中。局部变量声明语句可以与块中的其他类型的语句自由混合。

现在,“立即包含”是什么意思?

一些语句包含其他语句作为其结构的一部分;此类其他陈述是该陈述的子陈述。如果没有不同于 S 和 U 的语句 T 使得 S 包含 T 并且 T 包含 U,我们说语句 S 立即包含语句 U。以同样的方式,某些语句包含表达式(第 15 节)作为其结构的一部分。

让我们看看你的例子:

public class Test{
   public void newMethod(){

      if(true)int i=0;

   }
}

在这种情况下,我们有以下块:

{

          if(true)int i=0;

}

在这个块中,我们有一个If Statement

if(true)int i=0;

该语句又包含一个局部变量声明:

int i=0;

因此,违反了条件。回想一下:每个局部变量声明语句都立即包含在一个块中。但是,在这种情况下,局部变量声明包含在 If 语句中,该语句本身不是块,而是包含在另一个块中。因此,此代码无法编译。

唯一的例外是for循环:

A local variable declaration can also appear in the header of a for statement (§14.14). In this case it is executed in the same manner as if it were part of a local variable declaration statement.

(您可能需要重读几次才能理解。)

于 2013-10-09T18:50:04.410 回答
1

Dark Falcon 是对的,如果 if 测试之后的单个语句是一个变量声明,那么没有任何东西可以使用该变量,该声明的范围将被限制为 if 后件的主体,这将是无用的,因为紧随其后的任何东西都不会有i范围。

如果if (true)int i = 0;实际工作(意味着声明对后续行可见),则意味着您是否声明了变量将取决于 if 测试的结果,这不是很好。

顺便说一句,if (true) int i = 0;在 Eclipse 中导致此语法错误:

Multiple markers at this line
    - i cannot be resolved to a variable
    - Syntax error on token "int", delete 

虽然将括号括起来编译,但它会生成警告:

the value of the local variable i is not used
于 2013-10-09T18:37:48.057 回答