需要有关requireNonNull

时间:2018-07-31 08:08:33

标签: java android

getActivity().finish();

现在编辑器显示警告,其中该方法@Nullable 注释。然后显示使用requireNonNull的建议。当我接受其更改后,它将代码转换为此,并且警告消失了。

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

使用requireNonNull有意义吗?

requireNonNull的实现是

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

因此,如果getActivity()为空,我的代码仍然会崩溃。

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

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

我认为null checkrequireNonNull好,您说什么?如果是,则编辑器不建议在此处使用requireNonNull

因为在状态为Activity的字段中使用requireNonNull是不安全的。我是否缺少requireNonNull的好处?

2 个答案:

答案 0 :(得分:2)

此处明确的null检查是正确的,因为您要防止在getActivity返回null时引发NullPointerException。

Objects.requireNonNull()通常用于参数验证(快速失败),例如可以在构造函数中使用:

/** 
 * Constructs a new Foo instance. 
 *
 * @param bar a bar, not null  
 */
public Foo(Bar bar) {
    this.bar = Objects.requireNonNull(bar);
}
如果对象原来是Objects.requireNonNull,则

null将引发NullPointerException(这是RuntimeException)。我想IDE在这里建议不是理想的解决方案。

答案 1 :(得分:2)

这是对Java 8中引入的Java对象的显式null检查。Objects类也包含更多类似的静态方法。请参阅Java Doc Here

但是那些在Java 8 lambda表达式中更有用。当我们使用如下例所示的函数操作时,我们可以更方便地执行空值检查,尤其是使用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表达式,请阅读here。如果您不知道Lambda表达式,请不要担心。

更新

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

以上示例也与上一个示例相似。但是它们之间也存在差异。根据要求,我们可以选择是否需要在过滤器后不久使用.forEach函数操作。