将参数的可空性应用于返回值

时间:2013-04-22 18:52:26

标签: java nullable findbugs

我有一个声明接受并返回null的方法。

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

仅当nulltext时才返回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知道返回值和参数的可空性之间的这种联系?

1 个答案:

答案 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) { ... }
    

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