You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot编写null判断仍报错致应用停止问题排查

问题根因

报错出在locationDetailsService.findById(...)方法执行阶段,根本没有走到你后续编写的if(locationDetails1 == null)判断分支。
绝大多数场景下这个问题的诱因是:你在LocationDetailsService的findById方法实现中,调用Spring Data JPA Repository的findById方法时直接执行了Optional.get()。JPA的findById返回值是Optional<LocationDetails>类型,当查询不到对应数据时,直接调用get()会立刻抛出NoSuchElementException(对应你看到的"did not found"类错误),方法直接中断,不会返回null值,因此你写的null判断逻辑永远不会被触发。

修复步骤
  1. 修改Service层findById实现
    把LocationDetailsServiceImpl里的findById方法从直接抛错的写法,改成查询不到时返回null的安全写法,示例:

    @Override
    public LocationDetails findById(LocationDetailsId id) {
        // 错误写法:return locationDetailsRepository.findById(id).get();
        // 正确写法:查不到数据时返回null
        return locationDetailsRepository.findById(id).orElse(null);
    }
    

    改完之后,查询不到数据时方法会正常返回null,你写的if分支就能正常执行了。

  2. 补全事务保证(必做,避免脏数据)
    你的接口同时操作订单表、库存表多个数据写入逻辑,需要在接口方法上加@Transactional注解,保证操作原子性:如果中间任意一步报错,所有已经写入数据库的数据都会回滚,不会出现“订单已创建但库存没更新”的脏数据问题。

  3. 可选逻辑优化
    你现在更新已有库存的逻辑里,不需要重新new一个新的LocationDetails对象,直接修改查询到的持久态对象的数量再保存即可,避免漏赋值其他字段导致的数据异常,优化后的分支逻辑:

    else {
        // 直接用查询到的对象更新数量即可
        locationDetails1.setQuantity(locationDetails1.getQuantity() + quantity1);
        locationDetailsService.save(locationDetails1);
    }
    
注意事项
  • 所有拿到Optional返回值的场景,禁止直接调用get()方法,必须用isPresent()先判断存在性,或者直接用orElse()、ifPresent()等JDK提供的安全方法操作。
  • 涉及多表写入的业务接口,必须加事务注解,不要省。

内容的提问来源于stack exchange,提问作者jagan raj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:57:25