如何解决orElseThrow抛出的异常?附报错代码片段
问题分析与解决
你的代码里orElseThrow处出错,核心是Optional类型的使用逻辑错误,具体问题和修复方案如下:
核心问题
- Optional判断方式错误:如果
cartPojo.getProductid()返回的是Optional类型,不能用!= null判断是否存在值——规范中Optional对象本身不会为null,应该用isPresent()方法判断内部是否有值。 - 逻辑冗余与调用顺序问题:原代码中先判断Optional是否为null,再调用
orElseThrow,既不符合Optional的设计规范,也可能因为类型不匹配导致报错。
修复后的代码(推荐链式调用)
@Override public CartPojo save(CartPojo cartPojo) throws IOException { Cart cart = cartPojo.getProductid() .map(productId -> cartRepo.findById(productId) .orElseThrow(() -> new RuntimeException("Cart not found with product id: " + productId))) .orElseGet(Cart::new); // 补充:将cartPojo属性映射到cart,执行保存并转换为CartPojo返回 // cart.setProductName(cartPojo.getProductName()); // Cart savedCart = cartRepo.save(cart); // return convertToPojo(savedCart); }
分步解释
- 用
cartPojo.getProductid().map(...)处理存在productId的情况:如果Optional内部有值,就调用cartRepo.findById()查询Cart,找不到则抛出异常。 - 用
orElseGet(Cart::new)处理无productId的情况:如果Optional为空,直接创建新的Cart对象。 - 这种链式调用既符合Optional的设计意图,又消除了冗余的if-else判断,彻底解决原代码中
orElseThrow的使用错误。
传统方式修复(保留if结构)
如果想保留原有if逻辑,修正后代码如下:
@Override public CartPojo save(CartPojo cartPojo) throws IOException { Cart cart; // XXX替换为productId实际类型,比如Long、Integer Optional<XXX> productIdOpt = cartPojo.getProductid(); if (productIdOpt.isPresent()) { XXX productId = productIdOpt.get(); cart = cartRepo.findById(productId) .orElseThrow(() -> new RuntimeException("Cart not found with product id: " + productId)); } else { cart = new Cart(); } // 后续属性映射、保存及返回逻辑... return ...; }
注意:必须确保XXX类型和cartRepo.findById()的参数类型完全匹配,否则会出现类型不兼容错误。
内容的提问来源于stack exchange,提问作者Ritika Shrestha
相关产品推荐
相关产品推荐

