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

Java 8 Optional中未获取结果时的错误日志实现问题

解决Java 8 Optional orElseThrow中添加日志的问题

别担心,这个问题很好解决,核心是搞懂orElseThrow()的参数要求就行~你遇到报错是因为orElseThrow()需要接收一个Supplier<Throwable>类型的参数——简单说就是一个能返回异常对象的代码块,而不是直接执行一段无返回值的日志语句。下面给你两种纯Java 8风格的解决方案,不用回到传统的if判断写法:

方案一:在Lambda代码块中先打日志再抛异常

直接把日志操作和异常返回放在Lambda的大括号里,这样既执行了日志输出,又返回了符合要求的异常对象,完美适配Supplier的规则:

@PutMapping("/organs/{id}")
public Organ updateorgan(@PathVariable(value = "id") Long organId, @Valid @RequestBody Organ organDetails) {
    Organ organ = organRepository.findById(organId)
        .orElseThrow(() -> {
            // 在这里正常打印错误日志
            LOG.log(Level.SEVERE,"Organ with id "+organId + " not found");
            // 最后返回异常对象
            return new ResourceNotFoundException("organ", "id", organId);
        });
    organ.setName(organDetails.getName());
    Organ updatedOrgan = organRepository.save(organ);
    LOG.info("Updated organ details. Response :"+updatedOrgan);
    return updatedOrgan;
}

方案二:封装成单独方法(代码更整洁)

如果这种“打日志+抛异常”的逻辑在多个地方用到,可以把它封装成一个私有方法,然后在Lambda里调用,让代码更简洁:

@PutMapping("/organs/{id}")
public Organ updateorgan(@PathVariable(value = "id") Long organId, @Valid @RequestBody Organ organDetails) {
    Organ organ = organRepository.findById(organId)
        .orElseThrow(() -> handleOrganNotFound(organId));
    organ.setName(organDetails.getName());
    Organ updatedOrgan = organRepository.save(organ);
    LOG.info("Updated organ details. Response :"+updatedOrgan);
    return updatedOrgan;
}

// 封装的日志+异常处理方法
private ResourceNotFoundException handleOrganNotFound(Long organId) {
    LOG.log(Level.SEVERE,"Organ with id "+organId + " not found");
    return new ResourceNotFoundException("organ", "id", organId);
}

这两种方案都是纯Java 8的实现,完全符合你的要求,不用回到繁琐的if (optional.isPresent())传统写法。

内容的提问来源于stack exchange,提问作者I'm_Pratik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:42:00