Java 在if条件和无大括号内声明变量时出现编译器错误

Java 在if条件和无大括号内声明变量时出现编译器错误,java,if-statement,block,declaration,Java,If Statement,Block,Declaration,为什么第一个如果编译良好,第二个失败 if(proceed) {int i;} // This compiles fine. if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token) 因为语言规范这么说: 声明将一个实体引入程序,并包括一个标识符(§3.8),该标识符可在名称中用于引用该实体。声明的实体是以下实体之一: … 局部变量,以下变量之一: *在

为什么第一个
如果
编译良好,第二个失败

if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)

因为语言规范这么说:

声明将一个实体引入程序,并包括一个标识符(§3.8),该标识符可在名称中用于引用该实体。声明的实体是以下实体之一:

局部变量,以下变量之一:
*在块中声明的局部变量(§14.4)
*在for语句(§14.14)中声明的局部变量

第一个示例是在块内声明
i
(用花括号表示)。你的第二个不是,也不是一个
for
语句


编辑后添加:,这只是常识。如果允许的话,那就没用了。它将立即超出范围。

这是因为它不是有用的代码。 如果If语句没有大括号({}),则只执行If后面的第一行/语句。因此,如果只声明一个局部变量,它就不能在其他任何地方使用。因此,宣布它是绝对多余的

if(proceed){
int i= 0;
 // variable i can be used here
//...
}

if (proceed) int i; // i can not be used anywhere as it is a local variable

区块: {BlockStatementsopt} 区块声明: 区块语句 块语句块语句 区块声明: LocalVariableDeclarationStatement 类声明 陈述 及

声明: if(表达式)语句 似乎
inti
localvariabledclarationstatement
,而不是
语句。所以它不起作用。

如果(继续)inti

如果我们使用不带大括号的
If
语句,它将仅以条件方式执行带有
If
的第一行。其他行将正常执行

这是编译失败,因为局部变量声明是以条件方式进行的,并且编译器假定它不能用false语句访问


如果使用大括号,则在块中声明变量并使用局部变量,因此编译器假定它是可访问的代码。然后没有编译器错误
在C++中,这是允许的,但是java不允许这个< /p>我知道它是没有用的。但我想知道背后的规则是什么。我明白你的意思了,布莱恩。JLS(Java语言规范)总是一个好去处:)老实说,你在业余时间阅读其中的部分内容就可以学到一些东西,这真是太神奇了;我知道我学到了很多我不知道的东西。实际上,第二条语句将在包含
for
语句的块中声明局部变量,因此JLS的这一节不适用。Daniel的回答指出了此语法无效的真正原因。@JoniSalonen-您似乎不理解块是什么,或者不理解
if
语句和
for
语句之间的区别?Daniel的答案与我的答案相同-变量声明在
IfthenelsStatement
中无效;它仅在语句的
头中有效。OP的第一个示例是不带trailingsubstation的
语句(
ifthenelstatement
),它包含
块。他的第二个是一个赤裸裸的
,如果你被否决了,那不是我。我只是说你引用的JLS部分在这里不是决定性的:你引用的是术语“声明实体”的定义
是一种声明——它声明了实体
i
——但这本身并不意味着它是非法的。要了解为什么它是非法的,您必须参考
IfThenStatement
的定义。是的,这是一个愚蠢的分歧。这就是语法无效的真正原因。Brian回答中提到的关于声明的JLS部分是相关的,但不是真正的原因。但我想知道背后的规则是什么。看看布莱恩·罗奇的答案。顺便说一句,我并不是那个否决你答案的人相关:这是合理的解释编译器定义它不可访问,因为它的作用域已结束,而不是因为该语句可能为false。 Block: { BlockStatementsopt } BlockStatements: BlockStatement BlockStatements BlockStatement BlockStatement: LocalVariableDeclarationStatement ClassDeclaration Statement IfThenStatement: if ( Expression ) Statement