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

需要一些关于requireNonNull的澄清吗

贺雪松
2023-03-14
getActivity().finish();

现在,编辑器在使用@Nullable注释方法的地方显示警告。然后显示使用requirennull的建议。当我接受它的更改时,它会将代码转换为此,警告消失。

Objects.requireNonNull(getActivity()).finish();

使用要求NonNull有意义吗?

实现要求NonNull

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

所以如果getActive()为空,我的代码仍然会崩溃。

我们应该对此进行空检查。

if (getActivity() != null)
     getActivity().finish();

我认为空检查requirennoull好,你说呢?如果是,则编辑器不应建议在此处使用requirennull

因为在具有状态(如活动)的字段中使用要求NonNull是不安全的。我是否错过了要求NonNull的一些好处?

共有2个答案

戚飞
2023-03-14

这是Java8中引入的Java对象的显式空检查。Objects类也包含更多类似的静态方法。请参阅此处的Java文档。

但在Java8Lambda表达式中,这些更有用。当我们使用下面的示例这样的函数操作时,我们可以更方便地执行空检查,特别是使用requireNonNull方法,我们可以轻松地消除空值。

ArrayList<Object> abc = new ArrayList<>();

假设我们在这个ArrayList中有100个元素,一些随机值为null,同时我们需要处理这些非null值。然后我们可以执行以下步骤;

abc.stream().map(Objects::requireNonNull).forEach(obj -> {
     // Whatever action to be on obj element. 
});

如果你不知道lambda表达式,请在这里阅读。如果你不知道Lambda表达式,不要担心。

更新:

abc.stream().filter(Objects::nonNull).forEach(obj -> {
      // Whatever action to be on obj element. 
});

上面的例子也和前一个相似。但它们也有各自的区别。根据要求,我们可以选择是否需要使用。forEach功能操作是否在过滤器后立即执行。

洪浩
2023-03-14

这里显式的null检查是正确的,因为如果getActivity返回null,您希望防止引发NullPointerException。

对象。requireNonNull()通常用于参数验证(fail fast),例如在构造函数中使用:

/** 
 * Constructs a new Foo instance. 
 *
 * @param bar a bar, not null  
 */
public Foo(Bar bar) {
    this.bar = Objects.requireNonNull(bar);
}

Objects.requireNonNull将抛出一个NullPointerExc0019(这是一个RuntimeExc0019),如果对象被证明是null。我想IDE在这里建议的不是理想的解决方案。

 类似资料:
  • 我需要一些帮助来澄清写关注的概念,我使用MongoDb 4.0.2(带副本集)和java-mongo驱动程序3.8.1 我已经在mongo配置中添加了关于 在代码端,何时可以使用数据库的ack响应?我发现,当使用delete或update时,库返回一个Result对象(作为deletesult),其中包含一个函数,用于获取集合中多数副本的delete/update结果。 但是我找不到一个类似的所有

  • 来自 https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob#poison 当 Blob 触发器函数失败时... “失败”是什么意思?编译失败?引发未处理的异常? 如果有一些不起作用的示例代码,那就太好了。所有示例代码都显示了工作状态,因此无法演示 Azure 函数中的故障模式。

  • 我认为用A*算法应该是SAEFG,但答案是SBEFG。现在我的教授是一个无所事事的人。有人能解释为什么是SBEFG吗?

  • 我们有申报单 其中backlog被标识为传入连接的最大队列长度。如果连接指示在队列已满时到达,则会拒绝连接。 假设积压设置为10。 这是否意味着服务器套接字将接受不超过10个客户端? 然后: 只有当时,积压数才会下降。这是正确的吗? 有没有办法知道一个套接字当前正在处理多少个打开的连接(换句话说,它离放弃并开始拒绝新连接有多近)

  • 问题内容: 在互联网上找到了此代码,它是在多年前发布的,因此,我决定在这里询问一些我不太了解的行的说明。 在该方法中,他的意思是: 他是说如果图像中有图像,则应将其更改为? 是返回平方? 最后,当获得其父母时,谁是父母? 整个代码如下: 问题答案: 在该方法中,他的意思是:他是说如果图像中有图像,则应将其更改为? 我想你是故意的。通过使用,作者取消引用变量,因此分配给它的内容不再可通过is变量访问

  • 我对c中的属性格式说明符感到困惑。我在编译一些代码时遇到了一个警告。以下是警告: 警告:格式的参数太多 [-W 格式-额外参数] 下面是一个示例代码: 输出如下: 只要满足以下条件(基于实验),就会发出警告: < li >要检查的格式为空。 < li >在属性格式说明符的第三个参数中传递了一个零 < li >格式不是函数中的最后一个参数。 以下代码似乎工作正常,这让我相信NULL是一个有效的字符串