【问题标题】:Syntax error on token "double" within if statement body [duplicate]if语句正文中标记“double”的语法错误[重复]
【发布时间】:2018-06-23 10:10:49
【问题描述】:

当我尝试运行这段代码时:

public static void main(String[] args) {

    double salary = 10.1;

    if (salary >= 100.3)
        double number = salary * 10;
    else
        double number = salary * 20;

}

我收到以下错误:

标记“double”的语法错误,删除此标记

两者兼有:

数字无法解析为变量

现在代码故意不好,因为这是一个问题,我们必须说明它的所有问题。

据我了解,最好不要两次声明同一个变量,最好始终使用大括号;但是如果不使用大括号,为什么double number = salary * 10;double number = salary * 20; 会导致问题?我原以为它仍然可以正确编译和运行(如果使用括号,它可以工作)。

【问题讨论】:

  • 在没有大括号的if 语句中不允许声明。这是因为,如果if 中只能有一个声明,那么声明是没有用的。范围立即结束。
  • 你当然可以double number = salary >= 100.3 ? salary * 10 : salary * 20; 甚至double number = salary * (salary >= 100.3 ? 10 : 20);
  • @bcsb1001 它不会完全没用:int a = someFunctionWithSideEffect(a = veryExpensiveMethod(), a); (否则)是合法的(也许令人惊讶);在这里,a 可以用作临时变量,以避免重新计算参数。但这不是完全明智的代码,如果你真的想使用它,你总是可以用大括号把它包起来。只是指出您可以在 if 中使用变量声明来达到一些模糊的实际目的。

标签: java


【解决方案1】:

因为它违反了 Java 语法。 JLSdefines if statements如下:

IfThenStatement:
    if ( Expression ) Statement

所以它期待Statement。花括号表示BlockBlock is a Statement。但是,变量声明不是Statement1

这是直觉上明智的行为 - 如果您可以在此处声明一个变量,它将毫无用处,因为它会立即超出范围。


1。令人困惑的是,变量声明在 JLS 中称为LocalVariableDeclarationStatements。但是,就语言语法而言,这不是Statement

【讨论】:

  • 在什么意义上它们不是声明?当然,他们不是Statement,但他们是BlockStatement
  • @AndyTurner - 也许格式化我的答案会有所帮助? BlockStatement 不是 Statementif 期待 Statement
  • 是的,我认为反引号会更清楚。我认为这里的“令人困惑”是规范将其称为Statement,尽管其中不包括其他语句类型。
猜你喜欢
  • 1970-01-01
  • 2014-06-04
  • 2013-11-03
  • 2015-03-01
  • 1970-01-01
  • 2011-09-22
  • 2015-09-08
  • 2015-05-29
  • 2021-05-29
相关资源
最近更新 更多