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

空检查与可选的isPresent检查

翟丰茂
2023-03-14

有人能解释一下<code>是可选的</code>如何帮助我们避免<code>NullPointerException</code>吗?

Optional<String> op = someFunc()
if(op.isPresent()) {
   op.get();
}
String possibleNull = op.get();

这段代码不是也容易出现<code>NullPointerException</code>吗?如果是这样的话,那么为什么这个代码比其他代码更受欢迎

String op = someFunc()
if(op != null) {
   op.get();
}
String possibleNull = op;

可选除了帮助我们了解函数是否实际具有返回值之外,还提供了什么可能的好处

共有2个答案

仲孙焱
2023-03-14
String op = someFunc()
if(op != null) {
   op.trim();
}

当调用上面的接口someFunc()时,它并没有明确说明可以返回空值,所以调用者只能自己假设。

通过显式返回一个可选的,someFunc()的调用者知道接口可能返回null。从界面创建者的角度来看,这让他/她可以具体说明返回值,而不必单独记录。

Optional<String> op = someFunc()
if(op.isPresent()) {
   op.get().trim();
}
罗安和
2023-03-14

假设您希望获取函数返回的字符串,将其转换为大写,然后将其打印出来。如果您有:

String someFunc() { ... }

你可能会想写:

System.out.println(someFunc().toUpperCase());

当然,如果 someFunc 返回 null,这将引发 NullPointerException相反,假设我们有这个:

Optional<String> someFunc() { ... }

然后呢

System.out.println(someFunc().toUpperCase());

不起作用,因为< code>Optional没有< code>toUpperCase方法。在这一点上——希望——您会遇到一个< code>Optional,这应该让您考虑< code>Optional为空的情况。这有助于避免NPEs,但可能只是在一定程度上。

现在您可能专注于如何从可选中获取值,而您可能会忘记空格。啊,有一个get方法:

System.out.println(someFunc().get().toUpperCase());

这又带来了与NPE相同的问题,只不过异常是< code > NoSuchElementException 。因此,如果您盲目地在< code>Optional上调用< code>get,这实际上与在引用上调用方法而不检查它是否为null是一样的。

(出于这个原因,Brian Goetz认为Optional.get是Java8中最大的错误。请参阅他在大约16分钟内对Angelika Langer JAX 2015 Fragen und Antworten suJava8的采访。我不确定这是最大的,但这是一个错误。人们只是不期望get抛出异常。)

如果您努力检查空引用或空选项,那么

Optional<String> os = someFunc();
if (os.isPresent()) {
    System.out.println(os.get().toUpperCase());
}

并不比旧的好多少

String s = someFunc();
if (s != null) {
    System.out.println(s.toUpperCase());
}

Optional的真正优势在于它是一个库类,具有相当丰富的API,用于以安全的方式处理空情况。通过将几个方法调用链接到首先返回可选的方法,通常可以处理可选项中可能包含的值。例如,我们可以将上面的示例重写如下:

someFunc().map(String::toUpperCase)
          .ifPresent(System.out::println);
 类似资料:
  • 有人能解释一下如何帮助我们避免? 这段代码不是也容易出现吗?如果是这样的话,那么为什么这个代码比 除了帮助我们了解函数是否实际具有返回值之外,还有什么可能的好处

  • 问题内容: 我在Java中有以下搜索代码: 我希望按名称查找列并返回找到的第一个。 我了解在某些情况下什么也找不到,应该对其进行处理,但是如何处理呢? 这是这个咒骂所要的: ? 怎么修?如果没有发现,我希望返回。 更新 好吧,好吧,我只是没有意识到,那又回来了。 问题答案: 替换为。

  • 我喜欢的,我觉得很酷的东西 有人能告诉我我没意见吗?也许很酷,但成本很高?我不知道.多谢.

  • 我正在开发一个使用返回的方法的程序,我需要迭代它并创建一个新对象。我该怎么做? 我对Java可选选项的理解是减少检查,但如果没有检查,我仍然无法做到这一点。使用或并拥有简洁的代码,有没有更好的解决方案?

  • 问题内容: 在Objective-C中,当我有一个数组时 我想检查它是否不为空,我总是这样做: 这样一来,无需检查是否会因为这种情况将导致代码陷入错误,并且非空数组也会这样做。 但是,在Swift中,我偶然发现了一个可选数组: 而且我无法确定要使用哪种条件。我有一些选择,例如: 选项A:在相同条件下检查非用例和空用例: 选项B: 使用解除绑定数组: 选项C: 使用Swift提供的合并运算符: 我不