Java 应用参数';s返回值的可空性

Java 应用参数';s返回值的可空性,java,nullable,findbugs,Java,Nullable,Findbugs,我有一个方法被声明为接受和返回null @CheckForNull public static String truncate(@CheckForNull text, int maxLength) { ... } @Nonnull public static String trimmedOrEmptyIfNull(@CheckForNull text) { ... } ... @Nonnull private String message; ... message = truncate(tri

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

@CheckForNull
public static String truncate(@CheckForNull text, int maxLength) { ... }
@Nonnull
public static String trimmedOrEmptyIfNull(@CheckForNull text) { ... }
...
@Nonnull
private String message;
...
message = truncate(trimmedOrEmptyIfNull(e.getMessage()), 100);
仅当
text
null
时,它才会返回
null
。当我从标记为
@Nonnull
的方法传入返回值时,FindBugs无法知道
truncate
不会返回
null
,因此如果我将其分配给标记为
@Nonnull
的字段,就会发出警告

@CheckForNull
public static String truncate(@CheckForNull text, int maxLength) { ... }
@Nonnull
public static String trimmedOrEmptyIfNull(@CheckForNull text) { ... }
...
@Nonnull
private String message;
...
message = truncate(trimmedOrEmptyIfNull(e.getMessage()), 100);
此处的警告为假阳性,因为
trimmedOrEmptyIfNull
标记为
@Nonnull
,因此
truncate
将返回一个非null值,并可推断为
@Nonnull
本身


有没有办法让FindBugs知道返回值的可空性和参数之间的这种联系?

我还没有找到解决方案。实现它最困难的部分是,方法返回值继承的不是
text
参数的可空性注释,而是传递给它的参数值的可空性注释,在本例中是
trimmedOrEmptyIfNull
。以下是一些想法:

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

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

    @Nullability(inherit = "text")
    public static String truncate(@CheckForNull text, int maxLength) { ... }
    
  • 由于99%的情况可能涉及使用
    @Nonnull
    覆盖
    @CheckForNull
    @Nullable
    注释(这是一个合理的假设吗?),因此在现有注释的基础上添加一个新的参数注释。这还不清楚它是否适用于方法的返回值,也不清楚它是否使检查方法体变得容易。您是否假设参数标记为
    @CheckForNull

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

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

这是我不相信可空性注释永远可行的众多原因之一。