0

我有一个声明为接受和返回的方法null

@CheckForNull
public static String truncate(@CheckForNull text, int maxLength) { ... }

null仅当textis时才返回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 意识到返回值的可空性和参数之间的这种联系?

4

1 回答 1

0

我还没有想出解决办法。实现它最困难的部分是方法返回值继承的不是参数的可空性注释,text而是传递给它的参数值,在这种情况下是trimmedOrEmptyIfNull. 这里有一些想法:

  • 添加新的参数注释以代替现有注释。这并不清楚它是否适用于方法的返回值,也不是很容易检查方法的主体。您是否假设参数已标记@CheckForNull

    public static String truncate(@InheritNullness text, int maxLength) { ... }
    
  • 将参数添加到新方法注释。这也不清楚调用代码传递的参数的可空性是继承的。

    @Nullability(inherit = "text")
    public static String truncate(@CheckForNull text, int maxLength) { ... }
    
  • 由于 99% 的情况可能会涉及用(这是一个合理的假设吗?)覆盖 a @CheckForNullor@Nullable注释,@Nonnull因此除了现有注释之外,添加一个新的参数注释以使用。这并不清楚它是否适用于方法的返回值,也不是很容易检查方法的主体。您是否假设参数已标记@CheckForNull

    @CheckForNull
    public static String truncate(@InheritNonnull text, int maxLength) { ... }
    

我必须承认我并不真正喜欢他们中的任何一个。:(

于 2013-04-27T07:18:59.020 回答