[英]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.