Eclipse:import 中双分号的含义是什么?

4
使用Eclipse时,如果我在导入行上(不是最后一个导入行)多加了一个分号,IDE会显示语法错误。但是,在IDE之外编译(例如使用Maven)时,这却可以正常编译通过。
示例:
import java.util.ArrayList;; //notice extra semicolon
import java.util.List;

还有其他人看到这种行为吗?为什么会显示语法错误?我正在与一个不断将这些内容推送到源代码管理的人合作,这让我感到很烦(他们显然没有使用Eclipse)。

完全透明... 我正在使用SpringSource工具套件2.8.0。


快速提示:要快速修复这些类,请使用键盘快捷键Ctrl+Shift+O。这将修复当前打开的Java文件的所有导入。 - Stainedart
4个回答

3
这是一个语法错误,因为import是一个声明而不是语句,你不能在类外部拥有语句。
请参见JLS 7.5了解详细信息,但基本上,导入声明以单个;结束。
例如,单类型的导入:
SingleTypeImportDeclaration:
   import TypeName ;

在JLS对语法的描述中,没有任何歧义可以允许空的导入语句,并且除了包之外,编译单元的前置部分不允许有其他内容。
CompilationUnit:
        [[Annotations] package QualifiedIdentifier   ;  ] {ImportDeclaration}
{TypeDeclaration}

ImportDeclaration:
     import [ static] Identifier {   .   Identifier } [   .     *   ] ;

我理解为Eclipse是正确的,JDK编译器是不正确的。

所以,你告诉我这是JDK的错误而不是一个赞?唉 - smp7d
1
@smp7d 我只是这么说,但这离正确还有很长的路要走。无论它是否是一个错误;呵呵。顺便说一下,这个 有点相关。你在哪个平台上? - Dave Newton
Java 版本 "1.6.0_25" Java(TM) SE Runtime Environment (build 1.6.0_25-b06) Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode),Windows 7 Pro SP1 - smp7d
这被认为是JDK的一个bug:javac不应该接受那个位置上的分号,而Eclipse拒绝它是正确的。请参见https://bugs.openjdk.java.net/browse/JDK-8027682。 - jade

1

您将不再在Eclipse 4.15 (2020.03)中看到以下内容:

导入完成时不再出现多余的分号

大约18年前,有人报告说,导入完成会在已经存在分号的情况下添加一个不必要的分号(例如更改现有导入时)。

现在不再插入这个额外的分号了。


1

这不是编译器错误, 尽管有时它可能是一个 bug 的迹象 (一些意外删除的代码等).

您可能已经将 Eclipse 的警告设置得非常严格. 我喜欢这个设置. 您最好的方法是设置一些编码标准, 并使用 Checkstyle 和/或 Findbugs 等工具来强制执行它们. 至少其中一个会发现这个问题并惩罚您的同事!

编辑

看起来 Eclipse (至少 3.6 版本, 我没有测试 3.7) 确实将 import 语句后面的双分号报告为编译错误, 不管您的 "空语句" 设置如何. Eclipse 有自己独立于 JDK 编译器的内置编译器. 所以如果 Eclipse 不喜欢这个, 但是 JDK 编译器喜欢, 那么它表明其中一个有 bug (或者至少有不同的 JLS 解释!).

我建议将此问题作为 Eclipse 的 bug 报告 - 纯粹是因为他们通常会非常快速地调查事情, 并解释他们认为自己是正确的原因, 并升级和跟踪与 JDK 开发人员的 bug 报告.


据我所知,Eclipse将其报告为编译错误。它说:“标记“;”上的语法错误。” - smp7d
如果我尝试运行,会出现“Exception in thread "main" java.lang.Error: Unresolved compilation problem”的错误。 - smp7d
1
就像我说的那样,我猜你可能把空语句设为错误。你报告的异常并没有提供更多信息。Eclipse可以尝试运行未编译的代码 - 例如,即使一个不相关的类无法编译,你仍然可以对一个类运行单元测试。所有这个异常告诉你的是,你正在尝试运行具有“编译错误”的代码。但是,正如我所说,我怀疑“编译错误”是由于Eclipse设置过于严格而被虚构的,比JLS还要严格。 - dty
“Empty statement” 被设置为忽略。就像我说的,在最后一个导入行上是可以的。在任何其他代码上也是可以的。在 Java->编译器->错误/警告 中没有设置为“错误”。 - smp7d
Eclipse 合理地发出了错误信号。JDK 错误地接受了它: https://bugs.openjdk.java.net/browse/JDK-8027682 - jade

1

我知道。我的问题是为什么Eclipse会在这个地方出现问题。 - smp7d
更新了我的回答,我先忽略了 Eclipse 部分。 - r0ast3d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接