java - @EnsuresNonNullIf 注释给出 "conditional postcondition not satisfied"-警告

标签 java annotations checker-framework type-annotation

我正在使用检查器框架和类型注释来检查 @Nullable@NonNull 的使用是否正确。 在类似 Map 的类 1 中,Java 规范声明 get(…) - 方法在 map 不包含条目时返回 null对于那把 key 。因此,这些方法具有 @Nullable 注释。但是,当 contains(...) 返回 true 时,我想保证 get(...) 不会返回 null.

如何指定条件 NonNull?

据我所知,您可以通过使用 @EnsuresNonNullIf 注释 contains(…) 方法来实现此目的,如下所示:

@Pure
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
    return super.containsKey(key);
}

@Pure
public @Nullable TValue getStrict(final @Nullable Class<? extends TKeyClass> key) {
    Return super. gets (key);
}

但是,这会导致警告:

the conditional postcondition about 'this.getStrict(key)' at this return statement is not satisfied

我应该如何解决这个“后置条件不满足”警告?

我的环境:

  • 专家:3.0.4
  • Java:1.7.0_25(甲骨文)
  • Checker 框架 1.7.0(通过 maven 插件)

This Gist演示问题。


1) 它扩展了 map 的功能以检索具有“相似”键的条目。

最佳答案

到目前为止,我唯一的解决方案是将 @EnsuresNonNullIf 注释与 SuppersWarnings("nullness") 相结合。例如:

@SuppressWarnings("nullness")
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
    return super.containsKey(key);
}

要确定 @SuppressWarnings 的范围,您可以将实现委托(delegate)给未注释 @EnsuresNonNullIf 的方法。

关于java - @EnsuresNonNullIf 注释给出 "conditional postcondition not satisfied"-警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21308736/

相关文章:

checker-framework - 检查框架: Supress Warnings in default constructor

java - 检查器框架,有什么方法可以使 type.anno.before.modifier 警告静音/禁用?

java - 在 servlet 之间共享配置参数

java - 使用适用于桌面应用程序的 Java 开发工具包进行 AWS Cognito 登录

java - 无法通过 JDBC 驱动程序连接到 *.dbf 文件

java - 如何在 Swing 应用程序中使用 Guice

java - 如何保存使用我的注释的元素?

java - 获取Java注解所需的数据

java - @Resource 注释成员未注入(inject) - 错误代码或错误?

java - Checker Framework 可以与 Error Prone 一起使用吗?