【问题标题】:Compiler error when declaring a variable inside if condition and no curly braces在 if 条件中声明变量且没有大括号时出现编译器错误
【发布时间】:2012-03-01 16:09:20
【问题描述】:

为什么第一个 if 编译好而第二个失败?

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

【问题讨论】:

标签: java if-statement block declaration


【解决方案1】:

因为语言规范是这样说的:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

声明将实体引入程序并包含一个标识符(第 3.8 节),该标识符可用于名称中以引用该实体。声明的实体是以下之一:
...
局部变量,以下之一:
* 在块中声明的局部变量 (§14.4)
* 在 for 语句中声明的局部变量 (§14.14)

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

编辑添加:这只是常识。如果允许,那将毫无用处。它会立即超出范围。

【讨论】:

  • 我知道没用。但我想知道它背后的规则是什么。我明白你的意思,布赖恩。谢谢。
  • JLS(Java 语言规范)总是值得去的地方 :) 老实说,您在业余时间通过阅读其中的一部分来学习的一些东西真是太棒了;我知道我学到了很多我不会知道的东西。
  • 实际上第二条语句会在包含for 语句的块中声明局部变量,因此JLS 的这一部分不适用。丹尼尔的回答指出了这种语法无效的真正原因。
  • @JoniSalonen - 看起来你不明白什么是块,或者if 语句和for 语句之间的区别? Daniel 的回答和我的一样——变量声明在 IfThenElseStatement 中无效;它仅在BlockForStatement 的标头中有效。 OP 的第一个示例是包含BlockStatementWithoutTrailingSubstatement (IfThenElseStatement)。他的第二个是IfThenElseStatement
  • 如果你被否决了,那不是我。我只是说你引用的 JLS 部分不是这里的决定性部分:你引用的是术语“声明实体”的定义。应用该定义int i; 是一个声明——它声明了实体i——但仅此一项并不意味着它是非法的。要了解为什么它是非法的,您必须参考IfThenStatement 的定义。是的,这是一个愚蠢的头发分裂差异。
【解决方案2】:

来自Java Language Spec

阻止: { BlockStatementsopt } 块语句块语句 BlockStatement BlockStatement 块语句LocalVariableDeclarationStatement 类声明 声明

IfThen 语句: if ( 表达式 ) 语句

似乎int iLocalVariableDeclarationStatement,而不是Statement。所以它不起作用。

【讨论】:

  • +1。这是语法无效的真正原因。 Brian 的回答中提到的关于声明的 JLS 部分是相关的,但不是真正的原因。
【解决方案3】:

这是因为它不是有用的代码。 如果您有一个不带花括号 ({}) 的 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

【讨论】:

  • 这是明智的解释
【解决方案4】:

如果(继续) int i;

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

这是编译失败,因为局部变量声明是以条件方式发生的,编译器假设它不能通过 false 语句到达。

如果您使用花括号,则变量声明和块内局部变量的使用,因此编译器假定它是可访问的代码。然后没有编译器错误。

【讨论】:

  • 编译器定义它是不可到达的,因为它的作用域已经结束,而不是因为这个语句可能是假的。
【解决方案5】:

就像在 Java / C++ 中一样,如果我们写 if 时不带大括号,则只会执行第一条语句 在这种情况下,变量 i 没有用。你在 if 语句中声明它,它的作用域在这个语句之后结束,这是没用的

在 C++ 中,这是允许的,但 Java 不允许这样做

【讨论】:

  • Thanx abhi120,我知道它没用。但我想知道它背后的规则是什么。请参阅 Brian Roach 的回答。
  • 顺便说一句,我不是对您的答案 abhi120 投反对票的人。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多