5

我在带有 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 注释 :-((()

4

1 回答 1

1

对于 Eclipse Luna,开发工作集中在“典型”组合上:

  • Java 7 和声明注释
  • Java 8 和类型注解

在这个版本中,Java 8 和声明注释的组合(这个问题中要求的)没有完全实现。这已通过https://bugs.eclipse.org/bugs/show_bug.cgi?id=435805修复

自 M4 以来,该修复程序在 Eclipse Mars 的里程碑版本中可用。

OTOH,我只能鼓励使用 Java 8 的项目升级到类型注释以获得更大的表现力——实现更精确的空类型检查。

于 2015-02-26T19:31:38.293 回答