Java:见过编译器或工具拒绝数组初始值设定项中的最后一个逗号吗?

Java: ever seen a compiler or tool that REJECTS a final comma in array initializer?

我的谜团就这样开始了。考虑这段代码:

import java.util.Set;
import javax.annotation.processing.*;
import javax.lang.model.element.TypeElement;

@SupportedOptions({
  "thing1",
  "thing2",
})
public class fc extends AbstractProcessor
{
  @Override
  public boolean process( Set<? extends TypeElement> anns, RoundEnvironment re)
  {
    return false;
  }
}

如果你看过去的大部分脚手架(我只是想确保它是最低限度的完整,你可以 运行 你的编译器在上面),你会看到中间有一个注释,它采用字符串数组初始值设定项,"thing2" 后有一个逗号。现在,如果你是那种晚上带着 Java Language Specification 和你一起睡觉的人,你会记得最后一个逗号是完全有效的,"may appear after the last expression in an array initializer and is ignored." 所以如果你在你最喜欢的 javac, 你不会惊讶它编译完美。

这就是谜团。上面的例子直接来自 a real patch that was requested in a real project because of a real "illegal start of expression" compiler message,有人在构建那个项目时得到的,当他删除最后一个逗号时就消失了。

很明显,那个人使用的是 javac 的脑残版本,或者他的工具链中有一些其他 whizbang 源代码修改工具,但 Java 语法不太正确,而他在他的错误报告中提供了其他完整信息,在这种情况下,唯一真正重要的信息是他使用的编译器和工具链以及他使用的版本,而他没有提供任何信息!因此,不仅对不需要它的代码进行了虚假补丁,而且没有足够的信息来提交错误报告真正需要去的地方,工具供应商在有效 Java 上给出虚假错误.

所以,我有点众包 :) ...任何人都可以找到 Java 编译器或其他相关工具 编译以上内容代码成功,但标记了一个与本例中报告的错误类似的错误?然后也许我们会知道罪魁祸首是什么。

我只是有些恼火,因为我的代码被虚假地修补了 ;) ... 它至少让我感到烦恼,因为可能仍然存在一些尚未修复的工具,并且会让更多人混淆什么是 Java 什么不是,并导致更多奇怪的代码补丁。

谢谢!

IntelliJ IDEA 正确地编译了你的代码(当然),但它确实在 'Javac quirks' 类别中显示了一个警告(我的徒手画的重点很糟糕):

所以似乎并不是脑残或异国情调的 javacs 与尾随逗号作斗争,只是旧的逗号。

它已在 JDK 7 中得到修复,并且已将修复程序反向移植到 JDK 6 的较新版本。