Java:曾经见过一个编译器或工具,它在数组初始化器中拒绝最后一个逗号?

Cha*_*ack 10 java arrays syntax 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你看过大多数脚手架(我只是想确保它完全没有完成并且你可以运行你的编译器),你会看到中间有一个注释,它需要一个String数组初始化器,并且有一个逗号之后"thing2".现在,如果你是那种让Java语言规范在晚上与你同住的人,你会记得最后一个逗号是完全有效的,"可能会出现在数组初始值设定项中的最后一个表达式之后被忽略." 因此,如果您在自己喜欢的地方尝试这个javac,那么它完全编译就不会感到惊讶.

所以这就是谜.上面的示例直接来自真实项目中请求的真实补丁,因为有人在构建该项目时获得了真正的"非法表达式"编译器消息,并在删除最终逗号时离开了.

很明显,那个人正在使用一个braindamaged版本javac,或者在他的工具链中有一些其他的whizbang source munging工具,它没有完全正确的Java语法,虽然他在他的错误报告中提供了其他完整的信息,在这种情况下只有真正重要的信息将是谁的编译器和工具链以及他正在使用的版本,并且他没有提供任何这些!因此,不仅是对不需要它的代码进行了虚假修补,而且没有足够的信息来提交它真正需要的错误报告,工具供应商会在有效的Java上产生虚假错误.

所以,我有点众包这个:) ...任何人都可以找到一个不能成功编译上述代码的Java编译器或其他相关工具,但会标记类似于此示例中报告的错误吗?那么也许我们会知道罪魁祸首是什么.

我只是部分地感到恼怒,因为我的代码被虚假修补了;)...它至少让我感到烦恼,因为可能还有一些尚未修复的工具,并且会让更多的人感到困惑关于什么是Java和什么不是,并导致更多奇怪的补丁代码没问题.

谢谢!

Wan*_*uta 6

IntelliJ IDEA正确地编译你的代码(当然),但它确实在'Javac quirks'类别中显示警告(严重绘制的徒手重点我的):

截图

因此,看起来并不是javac那种与tra tra brain brain brain brain brain brain brain brain brain brain brain brain brain brain brain brain brain brain brain brain brain

它已在JDK 7中修复,修复程序已被移植到较新版本的JDK 6中.