我有一个方法声明接受并返回null
。
@CheckForNull
public static String truncate(@CheckForNull text, int maxLength) { ... }
仅当text
为null
时返回null
。当我从标记为@Nonnull
的方法传递返回值时,FindBugs无法知道truncate
不会返回null
,因此如果我将其分配给标记为@Nonnull
的字段,则会发出警告。
@Nonnull
public static String trimmedOrEmptyIfNull(@CheckForNull text) { ... }
...
@Nonnull
private String message;
...
message = truncate(trimmedOrEmptyIfNull(e.getMessage()), 100);
这里的警告是假阳性,因为trimmedOrEmptyIfNull
被标记为@Nonnull
,因此truncate
将返回一个非空值,可以推断为@Nonnull
本身。
是否有一种方法使FindBugs意识到返回值和参数的可空性之间的这种连接?
我还没有想出解决办法。实现它最困难的部分是理解方法返回值继承的不是 text
参数的空性注释,而是传递给它的参数值,在本例中是trimmedOrEmptyIfNull
的空性注释。以下是一些想法:
-
添加一个新的参数注释来代替现有的注释。这并不清楚它是否适用于方法的返回值,也不容易检查方法体。
参数是否标记为@CheckForNull
?public static String truncate(@InheritNullness text, int maxLength) { ... }
-
为新方法注释添加参数。这也不清楚调用代码传递的参数的可空性是继承的。
@Nullability(inherit = "text") public static String truncate(@CheckForNull text, int maxLength) { ... }
-
由于99%的情况可能涉及用
参数是否标记为@Nonnull
覆盖@CheckForNull
或@Nullable
注释(这是一个合理的假设吗?),因此除了现有注释之外,还可以添加一个新的参数注释来使用。这并不清楚它是否适用于方法的返回值,也不容易检查方法体。@CheckForNull
?@CheckForNull public static String truncate(@InheritNonnull text, int maxLength) { ... }
我必须承认我不喜欢他们中的任何一个。(