Java 需要一些关于requireNonNull的澄清吗
现在编辑器显示警告,其中方法用Java 需要一些关于requireNonNull的澄清吗,java,android,Java,Android,现在编辑器显示警告,其中方法用@Nullable注释。然后显示使用requirennull的建议。当我接受它的更改时,它会将代码转换为此,警告消失 getActivity().finish(); 使用requirennoull有意义吗? requirennull的实现是 Objects.requireNonNull(getActivity()).finish(); 我认为空检查比requirennoull好,你说呢?如果是,则编辑器不应建议在此处使用requirennull 因为在具有类似于
@Nullable
注释。然后显示使用requirennull
的建议。当我接受它的更改时,它会将代码转换为此,警告消失
getActivity().finish();
使用requirennoull
有意义吗?
requirennull
的实现是
Objects.requireNonNull(getActivity()).finish();
我认为空检查
比requirennoull
好,你说呢?如果是,则编辑器不应建议在此处使用requirennull
因为在具有类似于
活动的状态的字段中使用requirennoull是不安全的。我是否错过了requirennoull
的一些好处?这里的显式null
检查是正确的,因为您希望防止在getActivity
返回null
时引发NullPointerException
Objects.requireNonNull()
通常用于参数验证(fail fast),例如在构造函数中使用:
if (getActivity() != null)
getActivity().finish();
Objects.requirennoull
将抛出一个NullPointerException(这是一个RuntimeException),如果该对象被证明为null
。我认为IDE并不是这里的理想解决方案。这是Java 8中引入的Java对象的显式空检查。Objects类也包含更多类似的静态方法。请参阅
但在Java8Lambda表达式中,这些更有用。当我们使用下面的示例这样的函数操作时,我们可以更方便地执行空检查,特别是使用requireNonNull方法,我们可以轻松地消除空值
/**
* Constructs a new Foo instance.
*
* @param bar a bar, not null
*/
public Foo(Bar bar) {
this.bar = Objects.requireNonNull(bar);
}
如果您不知道lambda表达式,请阅读它。如果您不知道Lambda表达式,请不要担心
更新:
abc.stream().map(Objects::requireNonNull).forEach(obj -> {
// Whatever action to be on obj element.
});
上面的例子也和前一个相似。但它们也有各自的区别。根据要求,我们可以选择是否需要在过滤后立即使用.forEach
功能操作 IDE并没有说您应该使用requireNonNull
,它只是说方法调用可能会导致NullPointerException
,然后您必须引入nullcheck。不!,它以黄色高亮显示建议。当您将鼠标悬停在该字段上时,您将看到警告,当您按alt+enter时,您将看到建议。您可以配置该类型的警告,但建议并不总是有效的,然而,您必须向它添加一些逻辑,以避免出现您认为答案没有帮助的ExceptionId?正如文档所述,Objects::requirennoull
“主要用于进行参数验证,Objects::nonNull
应该优先使用流过滤集合。如果在第一个示例中处理null
值,将抛出RuntimeException,这显然不是所需的行为。是的。这种方法的目的可能不同。类似这样的场景,objectobj=Objects.requirennull(abc,“abc为空”)代码>会更好。这也会在初始化时发生。因此这将创建一个运行时异常。好的,所以IDE并没有给出一个很好的空检查建议,它只是fail fast
的一个实现。
ArrayList<Object> abc = new ArrayList<>();
abc.stream().map(Objects::requireNonNull).forEach(obj -> {
// Whatever action to be on obj element.
});
abc.stream().filter(Objects::nonNull).forEach(obj -> {
// Whatever action to be on obj element.
});