在使用Oracle java 8u25的windows 7 64位上,我在Spring套件3.6.2 (Eclipse )下遇到了nullcheck分析的奇怪行为。同一个具有java 7源代码兼容性的maven项目成功地在eclipse中找到了NPE错误,但是当我将maven中的编译版本更改为java1.8时,eclipse无法找到此错误。
我在Eclipse中的nullcheck分析配置( java ->Compiler->Error/ works > null analysis)是:包含null分析中的断言、基于真正启用注释的分析、真正的NotNull自定义注释被正确地设置为javax.validation.constraints.NotNull等等。(一切似乎都很好,因为它在java 7下工作)
我的maven pom在这里是http://pastebin.com/pF1yJSG2,正如上面提到的,当pom中的java.version为1.7NULL check工作时,当IS1.8NULL check不工作时。
示例源代码是:
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) {
}
}有谁知道哪里有问题,以及如何使nullcheck在JDK1.8兼容性下工作?
编辑: Maven似乎没有参与其中。在非maven项目上模拟的相同问题,其源代码和编译器的兼容性级别都设置为1.7。是虫子吗?
编辑2:经过更多的检查后,我发现注释中的以下差异造成了不同: java.lang.annotation.ElementType.TYPE_USE,当注释没有这一点时,在Java 8中没有检测到空检查,但是在Java 7下检测到了空检查。但是为什么呢?!为什么会有如此不同的行为?!
编辑3:经过MartinLippert的研究和我的测试,在java 7和java 8之间,nullcheck似乎发生了巨大的变化。空检测需要(从eclipse库的2.0版本中看到) java.lang.annotation.ElementType.TYPE_USE,在分析中忽略了@Target(value={METHOD、value={METHOD、ANNOTATION_TYPE、构造函数、参数})类型。所以现在的问题是:为什么在JAVA 8下的NULL分析只在新的元素类型下需要和工作呢?(我知道使用java 8可以充分利用新的语言特性,但是为什么需要破坏兼容性呢?例如,javax.validation @NotNull现在不能用作空检查注释:-())
发布于 2015-02-26 19:31:38
对于Eclipse露娜来说,开发工作的重点是“典型”组合:
在这个版本中,Java 8和声明注释(这个问题中所要求的)的组合没有完全实现。这已经通过bug.cgi?id=435805解决了。
自M4以来,该修复在面向Eclipse的里程碑构建中可用。
OTOH,我只能鼓励使用Java 8的项目升级到类型注释,以获得更大的表现力--支持更精确的空类型检查。
https://stackoverflow.com/questions/27041741
复制相似问题