Java 为什么我需要括号?爪哇语:;如果(真)int i=0&引用;

Java 为什么我需要括号?爪哇语:;如果(真)int i=0&引用;,java,compiler-errors,grammar,jgrasp,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; ^ 那就没有错误了 我知道这个问题对社区没有帮助,但我真的很好奇为什么我需要在这个声明中加括号。我用java编程已经有几年了,现在才

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

public class Test{
   public void newMethod(){

      if(true)int i=0;

   }
}
但是如果我这样写的话

Test.java:4: error: '.class' expected
      if(true)int i=0;
                  ^
那就没有错误了

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


顺便说一句,我使用的是JGrasp。

Dark Falcon是正确的,如果if测试后面的一条语句是变量声明,那么就没有任何东西可以使用该变量,那么该声明的范围将局限于if结果的主体,这将是无用的,因为后面的任何语句都不会有
I
的范围

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

顺便说一句,
如果(真)int i=0在Eclipse中导致此语法错误:

public class Test{
   public void newMethod(){

      if(true){
         int i=0;
      }

   }
}
在将括号括起来时,虽然会生成警告,但仍会编译:

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

这是我的理解。引述自:

14.2。块

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

the value of the local variable i is not used
所以块总是在大括号中
{…}

14.4。局部变量声明语句

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

Block:
    { BlockStatementsopt }

........     

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement

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

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

某些语句包含其他语句作为其结构的一部分; 此类其他语句是该语句的子语句。我们说 如果没有语句,则语句S立即包含语句U T不同于S和U,因此S包含T,T包含U 同样,一些语句包含表达式(§15)作为 他们的结构

让我们看一下您的示例:

LocalVariableDeclarationStatement:
    LocalVariableDeclaration ;

LocalVariableDeclaration:
    VariableModifiersopt Type VariableDeclarators

.......

VariableDeclarator:
    VariableDeclaratorId
    VariableDeclaratorId = VariableInitializer
在这种情况下,我们有以下块:

public class Test{
   public void newMethod(){

      if(true)int i=0;

   }
}
在这个块中,我们有一个
If语句

{

          if(true)int i=0;

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

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

唯一的例外是
for
循环:

int i=0;

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

始终使用括号…我不是Java程序员,但我认为这是因为
if
的单语句版本不允许变量声明。既然没有任何东西能够使用这个变量,为什么要这么做呢?这确实很有道理!我不知道我是怎么忽略了这一点的。虽然这很有道理,但我的印象是,在任何你可以发表声明的地方,声明都是合法的。。。这让我有点奇怪。>_@poke
javac
(1.7.0_17)在该行上产生4个错误,其中第一个错误是OP的错误消息。第二个是“非陈述”,然后是“非法开始表达”,最后是“;”我想知道为什么开发人员认为这是一个错误。@TonyTerminator:他们非常彻底。也许他们编写的代码生成器创建了无意义的代码,并希望捕获尽可能多的错误。@TonyTerminator:这样他们就不得不做更少的工作。每次声明变量时,都会涉及内存分配、范围更改等。他们决定只允许直接在
{}
块内声明变量。毕竟,正如其他人已经指出的那样,允许在其他地方使用它并没有多大帮助,语法越严格、越简洁,学习起来就越容易,产生的bug也就越少。他们试图通过使java更可靠和更可预测来改进C++的无限能力。是的,他们最终改变了一些语义……我认为你应该从开始,看看if后面允许的东西是
语句。语句在中定义,不明确包含任何变量声明。仅包含一个更具体的语句(您在这里期望的内容)和
Block
,这将按照您之前的解释进行定义,并且是唯一可以放置变量声明的地方。@poke:是的,但是14.4被称为“局部变量声明语句”,这有点令人困惑,即使14.5没有列出语句中的局部变量声明。
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.