[英]Java: (false?) positive S2637 in SonarQube 6.7.1 LTS
我在Java项目上使用SonarQube 6.7.1 LTS,并使用Maven声纳插件对其进行了分析。
我有以下代码示例,该示例在方法testGregorianCalendar2
发现一个S2637问题:
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;
}
在方法
testGregorianCalendar1
和testGregorianCalendar3
,Sonar找不到该问题。 我认为在testGregorianCalendar2
,也不应该找到它,或者应该在所有3种方法testGregorianCalendar*
找到它,因为:
Sonar应该自行决定是否GregorianCalendar.getInstance()
可以返回null。 如果是,则所有3个方法都可以返回null,Sonar应该在所有这些方法中找到问题。
如果为否,则使用非空值调用方法setTimeZone2
,然后它将返回非空值,因此testGregorianCalendar2
将返回非空值。
那里出了什么问题?
我不确定,但是这是我想发生的事情: setTimeZone2
有条件的return null
,因此如果不检查该null值,则不允许从@Nonnull
方法返回setTimeZone2
的返回值。
也就是说,分析器看到:
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
除非inputCalendar
为null,否则inputCalendar
将永远不会返回null;而由于GregorianCalendar.getInstance()
将永远不会返回null,则inputCalendar
永远不会为null,但是分析器可能不会评估setTimeZone2
在什么条件下可以返回null,只是在某些情况下可以。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.