Spring Boot异常使用疑问:原代码报错,orElseThrow写法为何可行?
问题原因解析
你遇到的报错核心是方法返回类型不匹配,具体拆解如下:
1. 错误写法的问题所在
你的PilleService接口定义findPille(Integer id)必须返回LePille类型(或它的子类),但你在else分支里写的是return new PilleException("pille not found")——PilleException是RuntimeException的子类,和LePille属于完全不相关的类型,编译器会严格检查返回值类型,自然会报红线错误。
2. orElseThrow能正常运行的原因
orElseThrow是Java Optional类提供的API,它的逻辑是:
- 如果Optional中存在值,直接返回该值(类型是
LePille,符合方法返回要求) - 如果Optional中没有值,就抛出你传入的异常对象,而不是返回它
一旦抛出异常,方法的执行流程会直接中断,不会走到返回步骤,完全满足方法返回LePille的约束——要么返回正确的业务对象,要么抛出异常终止方法,不存在返回错误类型的情况。
3. 你原来的if-else写法怎么改对
把return换成throw就可以解决问题,和orElseThrow逻辑完全一致:
@Override public LePille findPille(Integer id) { Optional<LePille> optionalLePille = pilleRepo.findById(id); if (optionalLePille.isPresent()) { return optionalLePille.get(); } else { throw new PilleException("pille not found"); // 这里是throw,不是return } }
内容的提问来源于stack exchange,提问作者user609511
相关产品推荐
相关产品推荐

