【问题标题】:Are unnecessary semicolons syntax errors?是不必要的分号语法错误吗?
【发布时间】:2019-11-08 10:06:07
【问题描述】:

今天早上,在进行 git refresh 之后,IntelliJ 抱怨我的项目不再编译干净了。罪魁祸首:

import javax.naming.Context;;

IntelliJ 抱怨:

错误:(33, 29) java: 标记 ";" 上的语法错误,删除此标记

该代码是由未使用 IntelliJ 的人推送的,它通过了我们的后端构建。

问题:是 javac 还是 IntelliJ 有问题?什么是说明上述代码应该是错误还是警告的文档/规范?

这是 IntelliJ 2019.2 CE EAP,在 MacO 上运行。

准确地说:IntelliJ“编辑器编译”与“构建”操作的结果之间似乎存在不匹配。有趣的事实:我们的项目设置中有“使用 Eclipse 编译器”。将其更改为使用 javac 可以解决问题,双 ;;那么只是一个警告。

【问题讨论】:

  • import 语句中的额外分号...有趣。
  • 您使用的是哪个版本?
  • 它来自 IntelliJ,我的没有这个问题。我可以在 import 语句后加一千分号
  • @YCF_L 查看我的更新。
  • 这是个好问题。如果我是你,我会寻找一个指向 JSL 的答案,并解释为什么在导入声明中允许 ; 在类型声明中(但不是在包声明中 - 你不能在之前放置 ; package 部分)

标签: java intellij-idea language-lawyer


【解决方案1】:

不必要的分号不是错误。它们被视为空语句。一个什么都不做的空语句不是错误。

交叉检查您的代码。它也可能是 IntelliJ 的错。它的 linting 服务可能不会将其视为法律声明。

问题类似于this

编辑 1:IntelliJ 在其设置中有一个选项,可以将多余的分号作为错误发布。

【讨论】:

  • 声明一般不允许在顶级范围内。因此,您认为顶层允许空语句的结论是有缺陷的。
  • 我同意。但根据问题,后端构建成功。如果是这样,它不应该失败吗? ://
  • ; 什么都不做,但是在包声明中是不允许的,为什么?
【解决方案2】:

根据Java Language Specification §7.6 ; 是一个有效的类型声明:

顶级类型声明声明顶级类类型 (§8 (Classes)) 或顶级接口类型 (§9 (Interfaces))。

类型声明:

额外的“;”出现在编译单元中类型声明级别的标记对编译单元的含义没有影响。 Java 编程语言中允许使用杂散分号,仅作为对习惯于放置“;”的 C++ 程序员的让步。在类声明之后。它们不应在新的 Java 代码中使用。

如果 InteliJ 中没有可以改变这种行为的设置,那么额外的分号不应产生错误。

【讨论】:

  • 您可以在导入声明之前放置一个;,这使得它不是TypeDeclaration
  • 现在这很有趣。在这种情况下,编译器应该拒绝该代码。任何来源(JLS)这是合法的?
  • 不,它编译得很好。我发现的不一致(在 JLS 中没有引用)是 ; 在导入声明中被允许,但在包声明中不允许。我假设包声明总是被排除在单个语句之外,所以即使是这些虚拟的空语句也被拒绝。
【解决方案3】:

免责声明

解决了这个问题,因为事实证明错误发生与使用 Eclipse 编译器(与默认的 javac 编译器相反)有关。

这对于故障排除/突出显示 IntelliJ 的检查自定义功能可能仍然有用。


您可以在 IntelliJ 的检查配置文件中设置不必要的分号(以及许多其他内容)的严重级别。

冗余分号的默认设置是“警告”。 可能您的已设置为“错误”。

这不会影响 Java 编译器,因为多余的分号不是语法错误。

【讨论】:

  • @GhostCatsaysReinstateMonica 啊。也许一些 linter 插件? :S
  • 问题中的消息看起来像是破坏了构建,但将此检查设置为“错误”不会。而且消息有点不同(只是“不必要的分号';'”)。
  • @Tom mmh。你是对的,我找不到配置内置检查器以准​​确复制问题的方法。我不确定它是否真的破坏了 OP 的构建。也许这是由于一些外部插件,如 SonarLint...
  • Ghostcode 编辑了问题并提到了问题所在:使用 eclipse 编译器(您也可以为此设置 IDEA)。编辑器仍然只显示警告(或设置检查时的错误),但构建随后中断。
  • @Tom 很有趣。我自己从未使用过该选项。那么可能是eclipse编译器中的一个合法错误......
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2020-12-09
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多