Java:(假?)在SonarQube 6.7.1 LTS中为正S2637

时间:2018-01-31 11:07:25

标签: java sonarqube

我在Java项目中使用SonarQube 6.7.1 LTS,并使用Maven声纳插件对其进行分析。

我有以下代码示例,它在方法public static final @Nonnull Calendar testGregorianCalendar1() { return GregorianCalendar.getInstance(); } public static final @Nonnull Calendar testGregorianCalendar2() { return setTimeZone2(GregorianCalendar.getInstance()); } public static final Calendar setTimeZone2(final Calendar inputCalendar) { if (null == inputCalendar) { return null; } return inputCalendar; } public static final @Nonnull Calendar testGregorianCalendar3() { return setTimeZone3(GregorianCalendar.getInstance()); } public static final Calendar setTimeZone3(final Calendar inputCalendar) { return inputCalendar; } 中找到S2637问题:

testGregorianCalendar1
  

在方法testGregorianCalendar3testGregorianCalendar2中,Sonar找不到该问题。   我认为在testGregorianCalendar*中,它也应该找不到,或者它应该在所有3种方法GregorianCalendar.getInstance()中找到,因为:

如果setTimeZone2可以返回null,Sonar应自行决定。 如果是,则所有3种方法都可以返回null,Sonar应该在所有这些方法中找到问题。

如果不是,则使用非空值调用方法testGregorianCalendar2,然后它将返回非空值,因此{{1}}将返回非空值。

那里出了什么问题?

1 个答案:

答案 0 :(得分:2)

我不确定,但这是我猜的正在发生的事情:setTimeZone2有一个条件return null,因此从setTimeZone2返回@Nonnull的返回值如果没有检查该空值,则不允许使用方法。

即,分析仪看到:

public static final Calendar setTimeZone2(final Calendar inputCalendar) {
    if (/* something */) {
        return null;
    }
    return /* null if inputCalendar is null */;
}

它确定:setTimeZone2的返回值是(可能)@Nullable

然后它看到了:

public static final @Nonnull Calendar testGregorianCalendar2() {
    return setTimeZone2(/* something */);
}

它会看到从标记为@Nullable的方法返回的潜在@Nonnull值,会产生警告。

你和我可以推断setTimeZone2永远不会返回null,除非inputCalendar为空,并且inputCalendar永远不能为空,因为GregorianCalendar.getInstance()永远不会返回null,但是分析器可能没有在 条件setTimeZone2可以返回null的情况下进行评估,只是它可以在某些条件下。