当前位置: 首页 > 知识库问答 >
问题:

在方法中检查可为null的变量是否为null,但无法识别

施学
2023-03-14

我正在使用IntelliJ IDEA的代码检查来评估@Nullable注释。目前我正在使用org。喷气式飞机。注释package,但是如果这有助于解决问题,我也可以切换到另一个实现。

问题是带注释变量的无效性检查是用另一种方法完成的。这是代码检查器无法识别的。

java prettyprint-override">@Nullable
private Bar myVar;

public boolean isNotNull() {
    // This check is actually more complex, but will
    // only ever return true if myVar is not null
    return myVar != null;
}

public void foo() {
    if (isNotNull()) {
        // Here I get a warning that myVar might be null
        myVar.bar();
    }
}

我能让IntelliJ认识到这种情况吗?

共有2个答案

公胤运
2023-03-14

如果您的程序是单线程的,您不应该重写程序来满足IntelliJ的检查。另一个可以验证代码的工具是Nullness Checker。您可以在IntelliJ中运行它。

这里是一个MWE。@EnsuresNonNullif注释表达了您的规范"这个检查...只有当myVar不为空时才会返回true。"

import org.jetbrains.annotations.Nullable;
import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;

public class SO57496219 {

  private @Nullable Object myVar;

  @EnsuresNonNullIf(result = true, expression = "myVar")
  public boolean isNotNull() {
    return myVar != null;
  }

  public void foo() {
    if (isNotNull()) {
      myVar.toString();
    }
  }
}

如果您的程序是多线程的,您有几种方法。这里有两个。

>

您可以传递-AconcurrentSemantics命令行选项。仅当您更改程序时,例如将值放入局部变量(如Andy Turner所建议的)时,才会进行验证。但是,如果您希望其他线程同时更改该值,那么您的程序可能应该使用锁。

欧博简
2023-03-14

我怀疑intellij在抱怨,因为它不知道isNotNull()的返回值指示myVar的无效性。

但是,在调用bar()时,它可能为空。

在调用isNotNull()和使用myVar之间,其他一些线程可能潜入并将myVar更改回null。

保证它的唯一方法是:

  1. 复制myVar到一个局部变量中;
  2. 使用localMyVar!=nulllocalMyVar.bar()
 类似资料:
  • 我正试图在android中创建一个干净的复选框代码,但如果我只是按下按钮而没有选中复选框,则会出错这是清理复选框的代码: 这是我在重置按钮上输入的代码 该复选框是一个声明: 显然,如果未选中复选框并出现错误,tem.getItemId为null。 注:如果你不知道答案或不明白,最好询问或继续,然后投否决票。让其他有帮助的人看到这个问题

  • 问题内容: 与空检查相比,变量分配是否昂贵?例如,在将foo分配为null之前是否值得检查其是否为null? 还是这无所顾忌? 问题答案: 这是一个微微优化(可能还是由编译器处理)。不用担心 通过专注于程序的实际算法,您将获得更大的回报。 我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。-唐纳德​​·努斯

  • 问题内容: 我需要检查value是否定义为任何东西,包括null。将null值视为undefined并返回。以以下为例: 请注意,这是未定义的。 我需要找到满足以下条件的条件: 有任何想法吗? 问题答案: IIRC,您可以使用此功能:

  • 问题内容: 我有一个名为的对象。 它具有几个属性; 我将一个人对象设置为。 1.)我需要检查对象是否不为null;以下表达式正确吗? 2.)我需要知道ID是否包含一个Int。 但是,java不允许这样做。我该如何检查? 问题答案: An 不为null,如果未初始化,则可能为null 。 如果您希望整数可以为null,则需要使用代替。 此外该语句不能为真,因为如果为null,则将抛出a。所以正确的表

  • 如何在Java中检查长值的null? 这样行吗?

  • 我正在用MockMvc做一些测试,我想验证JSON响应的结构。具体地说,我希望确保某个属性的键存在,并且该值是某种类型或NULL。 是否有任何聪明的Hamcrest匹配器可以应用于每个属性的单个json路径?