避免java.util.NoSuchElementException: No value present
记一次报错问题
后台日志如下:
java.lang.NumberFormatException: For input string: "管理员--施工工器具管理员"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:589)
at java.lang.Long.valueOf(Long.java:803)
at com.cvit.storage.starter.service.impl.StorageToolServiceImpl.update(StorageToolServiceImpl.java:294)
at com.cvit.storage.starter.service.impl.StorageToolServiceImpl$$FastClassBySpringCGLIB$$78bf73a2.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)
at com.cvit.storage.starter.service.impl.StorageToolServiceImpl$$EnhancerBySpringCGLIB$$d44acd0f.update(<generated>)
at com.cvit.storage.starter.controller.StorageToolController.update(StorageToolController.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
java.util.NoSuchElementException: No value present
异常是 Java 中 Optional
类的一个典型错误,表示从一个空的 Optional
对象中获取值,但是这个 Optional
对象实际上并没有包含任何值。
在 Java 8 及其后续版本中,Optional
类被引入,作为 null
值的一个可能的替代方案。Optional
允许表示一个值存在或不存在,从而帮助减少 NullPointerException
的风险。
这个异常通常发生在调用 Optional
对象的 get()
方法时,而没有首先检查 Optional
是否包含值。由于 get()
方法在 Optional
为空时抛出 NoSuchElementException
,因此应该总是确保在调用 get()
之前,Optional
确实包含了一个值。
下面是几种避免 NoSuchElementException
的方法:
-
使用
ifPresent()
方法:Optional<String> optional = Optional.empty(); optional.ifPresent(value -> { // 这里处理值,如果optional为空,则不会执行这里的代码 });
-
使用
orElse()
、orElseGet()
或orElseThrow()
方法提供默认值或抛出异常:Optional<String> optional = Optional.empty(); String value = optional.orElse("默认值"); // 如果optional为空,返回"默认值" String value = optional.orElseGet(() -> "通过Lambda表达式获取的默认值");
try { String value = optional.orElseThrow(() -> new RuntimeException("没有值")); } catch (Exception e) { // 处理异常 }
-
使用
isPresent()
方法检查值是否存在,然后再调用get()
:Optional<String> optional = Optional.empty(); if (optional.isPresent()) { String value = optional.get(); // 处理值 } else { // 处理optional为空的情况 }
使用 Optional
的主要目的是使代码更加清晰和健壮,特别是在处理可能为 null
的值时,需要格外注意。
更多推荐
所有评论(0)