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。
答案 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