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; } }
如果你看过大部分的脚手架(我只是想确保它的最低限度完成,你可以运行你的编译器),你会看到在中间有一个注释,它需要一个String数组初始化程序,并有一个“thing2”之后的逗号.现在,如果你是Java Language Specification晚上睡觉的人,你会记得一个最后的逗号是完全有效的,“可能会出现在数组初始值设定中的最后一个表达式之后,被忽略.所以如果你尝试这个在你最喜欢的javac,你不会感到惊讶,它完美的编译.
所以这里是谜.上述的例子直接从a real patch简化为实际项目要求,因为有人在建设该项目时获得了a real “illegal start of expression” compiler message,当他删除了最后的逗号时,他们走了.
很清楚,这个人正在使用一个脑损伤的javac,或者在他的工具链中还有一些没有Java语法的whizbang源代码工具,而他的bug报告中提供了其他完整的信息,在这种情况下只有真正重要的信息将是他的编译器和工具链以及他正在使用的版本,他没有提供任何的信息!因此,不仅是不需要代码的虚假修补程序,而且还没有足够的信息来提交真正需要执行的错误报告,这是在有效的Java上提供虚假错误的工具供应商.
所以,我是一个众包这个:) …任何人都可以找到一个Java编译器或其他相关的工具,不能成功编译上面的代码,但标记一个类似于本例中报告的错误?那么也许我们知道是什么罪魁祸首.
我只是部分被忽略,因为这是我的代码被伪装修补;)…它至少可以让我至少有一些工具还没有被修复,并且会让更多的人感到困惑关于什么是Java和什么不是,并导致更奇怪的修补程序代码,没关系.
谢谢!
解决方法
所以看起来,这不是那么多的脑力亢奋或异国情调的javacs与后面的逗号,只是旧的.
> Related question
> JDK bug report
它已经在JDK 7中修复,修复已经被返回到较新版本的JDK 6.