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) { ... }
我必须承认我并不真的喜欢他们中的任何一个(这是我不相信可空性注释永远可行的众多原因之一。