异常:java.util.NoSuchElementException: No value present

常见原因:
使用 Optional 类的 get() 方法时,而该 Optional 对象中没有值的情况下

通常会报这个错误的原因是你在一个没有值的 Optional 对象上调用了 get() 方法,而 get() 方法只能用于含有非空值的 Optional 对象。当 Optional 对象为空时,
调用 get() 方法将抛出 NoSuchElementException 异常。

Optional类是Java 8引入的一个用于处理可能为空值的容器类。它的主要目的是解决Null引用的问题,以减少Null引发的空指针异常。
Optional类的实例可以包含一个非空的值(被称为“存在”),也可以为空(被称为“缺失”)。通过使用Optional类,我们可以在代码中明确表示一个值可能不存在的情况,并采取相应的处理措施,而不是简单地使用null。
以下是Optional类的一些常用方法:

  • of(value):创建一个包含指定值的Optional对象。如果传入null,则抛出NullPointerException异常。
  • ofNullable(value):创建一个Optional对象,包含指定的值。如果传入null,则创建一个空的Optional对象。
  • isPresent():检查Optional对象是否包含一个非空的值。如果存在值,则返回true,否则返回false。
  • get():获取Optional对象中的值。如果Optional对象为空,会抛出NoSuchElementException异常。请注意,不建议频繁使用get()方法,而应该优先使用其他方法来避免异常的抛出。
  • orElse(defaultValue):获取Optional对象中的值,如果Optional对象为空,则返回一个默认值。
  • orElseGet(supplier):获取Optional对象中的值,如果Optional对象为空,则使用一个提供者(Supplier)生成一个默认值。
  • orElseThrow(exceptionSupplier):获取Optional对象中的值,如果Optional对象为空,则抛出由提供者(Supplier)生成的异常。

解决这个问题,可以在取值的时候对对象判空,然后使用或者使用 isPresent() 方法来先检查 Optional 对象是否有值,然后再调用 get() 方法。

Optional<String> optionalValue = Optional.ofNullable(getValue());
if (optionalValue.isPresent()) {
    String value = optionalValue.get();
    // 在这里处理value
} else {
    // Optional对象为空的处理逻辑
}

同样的,在使用Optional对象时,可以避免使用get()方法,以避免它可能引发NoSuchElementException异常。或者可以使用orElse()方法或orElseGet()方法来提供一个默认值,以避免异常的抛出。

简单记录一次java.util.NoSuchElementException: No value present问题

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐