我有一个声明接受并返回null
的方法。
@CheckForNull
public static String truncate(@CheckForNull text, int maxLength) { ... }
仅当null
为text
时才返回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知道返回值和参数的可空性之间的这种联系?
答案 0 :(得分:0)
我还没有找到解决方案。实现它的最棘手的部分是,方法返回值继承而不是 text
参数的可空性注释,但传递给它的参数值,在这种情况下是trimmedOrEmptyIfNull
。以下是一些想法:
添加新参数注释以用于代替现有注释。这不清楚它是否适用于方法的返回值,也不容易检查方法的主体。您是否认为参数标记为@CheckForNull
?
public static String truncate(@InheritNullness text, int maxLength) { ... }
将参数添加到新方法注释中。这也不清楚调用代码传递的参数的可为空性是继承的。
@Nullability(inherit = "text")
public static String truncate(@CheckForNull text, int maxLength) { ... }
由于99%的案例可能涉及用@CheckForNull
覆盖@Nullable
或@Nonnull
注释(这是一个合理的假设?),因此请添加新的参数注释除现有注释外还使用。这不清楚它是否适用于方法的返回值,也不容易检查方法的主体。您是否认为参数标记为@CheckForNull
?
@CheckForNull
public static String truncate(@InheritNonnull text, int maxLength) { ... }
我必须承认我并不是真的喜欢他们中的任何一个。 :(