记一次报错问题

后台日志如下:

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 的方法:

  1. 使用 ifPresent() 方法:

    Optional<String> optional = Optional.empty();  
    optional.ifPresent(value -> {  
        // 这里处理值,如果optional为空,则不会执行这里的代码  
    });
  2. 使用 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) {  
        // 处理异常  
    }

  3. 使用 isPresent() 方法检查值是否存在,然后再调用 get()

    Optional<String> optional = Optional.empty();  
    if (optional.isPresent()) {  
        String value = optional.get();  
        // 处理值  
    } else {  
        // 处理optional为空的情况  
    }

使用 Optional 的主要目的是使代码更加清晰和健壮,特别是在处理可能为 null 的值时,需要格外注意。

 

Logo

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

更多推荐