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' 类别中显示了一个警告(我的徒手画的重点很糟糕):
所以似乎并不是脑残或异国情调的 javac
s 与尾随逗号作斗争,只是旧的逗号。
- Related question
- JDK bug report
它已在 JDK 7 中得到修复,并且已将修复程序反向移植到 JDK 6 的较新版本。
我的谜团就这样开始了。考虑这段代码:
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' 类别中显示了一个警告(我的徒手画的重点很糟糕):
所以似乎并不是脑残或异国情调的 javac
s 与尾随逗号作斗争,只是旧的逗号。
- Related question
- JDK bug report
它已在 JDK 7 中得到修复,并且已将修复程序反向移植到 JDK 6 的较新版本。