为什么我在这里需要括号? Java:“if(true)int i = 0;”

时间:2013-10-09 18:15:02

标签: java compiler-errors grammar jgrasp

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。

2 个答案:

答案 0 :(得分:7)

这是我的理解。引自Chapter 14 of JAVA SE 7 specification

  

14.2。块

     

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

Block:
    { BlockStatementsopt }

........     

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement

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

  

14.4。本地变量声明声明

     

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

LocalVariableDeclarationStatement:
    LocalVariableDeclaration ;

LocalVariableDeclaration:
    VariableModifiersopt Type VariableDeclarators

.......

VariableDeclarator:
    VariableDeclaratorId
    VariableDeclaratorId = VariableInitializer
     

.......

     

每个局部变量声明语句都会立即被一个块包含。本地变量声明语句可以混合使用   与块中的其他类型的陈述一起自由。

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

  

有些陈述包含其他陈述作为其结构的一部分;   这样的其他陈述是陈述的替代。我们这么说   如果没有语句,语句S立即包含语句U.   T与S和U不同,S含有T,T含有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.

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

答案 1 :(得分:1)

黑暗猎鹰是对的,如果if测试之后的单个语句是变量声明,那么没有任何东西可以使用该变量,声明的范围将限制为if结果的主体,这将是无用的,因为任何跟随在范围内不会有i

如果if (true)int i = 0;实际上有效(意味着声明对后续行可见),那就意味着你是否有一个声明的变量将取决于if测试的结果,这不会很好。

BTW,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