我在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
在方法
testGregorianCalendar3
和testGregorianCalendar2
中,Sonar找不到该问题。 我认为在testGregorianCalendar*
中,它也应该找不到,或者它应该在所有3种方法GregorianCalendar.getInstance()
中找到,因为:
如果setTimeZone2
可以返回null,Sonar应自行决定。
如果是,则所有3种方法都可以返回null,Sonar应该在所有这些方法中找到问题。
如果不是,则使用非空值调用方法testGregorianCalendar2
,然后它将返回非空值,因此{{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的情况下进行评估,只是它可以在某些条件下。