我在带有 Oracle java 8u25 的 Windows 7 64 位上的 Spring 工具套件 3.6.2(Eclipse 克隆)下遇到了 nullcheck 分析的奇怪行为。与java 7源兼容的同一个maven项目在eclipse中成功找到NPE错误,但是当我将maven中的编译版本更改为java 1.8时,eclipse找不到这个错误。
我在 Eclipse 中的 nullcheck 分析配置(Java->Compiler->Errors/Warnings->Null 分析)是: 在 null 分析中包含断言 true 启用基于注释的分析 true NotNull 自定义注释正确设置为 javax.validation.constraints.NotNull 等。 (一切似乎都很好,因为它在 java 7 下工作)
我的 maven pom 在这里http://pastebin.com/pF1yJSG2,如上所述,当 pom 中的 java.version 为 1.7 空检查有效时,1.8 空检查无效。
示例源代码为:
package test.nullcheckbug.core;
import javax.validation.constraints.NotNull;
public class Program {
/**
* This will fail to compile under java 7 (null analysis works in STS
* 3.6.2). But under java 8 it does not show error in Eclipse Markers -
* static analysis does not work ?!
*
* @return null which is not allowed
*/
@NotNull
public String fail() {
return null;
}
/**
* Simple main.
*
* @param args
* ignored args
*/
public static void main(String[] args) {
}
}
有人知道问题出在哪里以及如何在 jdk 1.8 兼容性下启用 nullcheck 吗?
编辑:Maven 似乎没有参与。在具有相同源代码和编译器兼容级别设置为 1.7 的非 maven 项目上模拟了相同的问题。这是一个错误吗?
EDITED-2:经过更多检查,我发现注释中的以下差异有所不同: java.lang.annotation.ElementType.TYPE_USE ,当注释没有这个时,在Java 8下未检测到nullcheck,但在Java下检测到7. 但是为什么?!为什么会有如此不同的行为?!
EDITED-3:在 MartinLippert 的研究和我的测试之后,似乎 nullcheck API 在 java 7 和 java 8 之间发生了巨大变化。空检测需要(从 Eclipse 库的 2.0 版中看到)java.lang.annotation.ElementType.TYPE_USE, @Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 类型在分析中被忽略。所以现在的问题如下:为什么 NULL 分析在 JAVA 8 下需要并且只在新元素类型下工作?(我知道使用 java 8 可以充分利用新的语言功能,但为什么需要破坏兼容性?例如 javax.validation @NotNull 现在无法用作 nullchecking 注释 :-((()