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 check
比requireNonNull
好,您说什么?如果是,则编辑器不建议在此处使用requireNonNull
。
因为在状态为Activity
的字段中使用requireNonNull是不安全的。我是否缺少requireNonNull
的好处?
答案 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
函数操作。