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

Java退货方法陷入死循环求助:重复提示输入商品名称

问题分析与修复方案

死循环的根本原因:无限递归

你的returnProduct方法里犯了一个致命错误——在获取用户输入后,直接调用了returnProduct(returnProd),这会让方法无限递归调用自己。每次调用都会重新执行所有逻辑,包括再次打印输入提示,所以程序会一直循环弹出那句话,根本停不下来。

除此之外还有两个坑:

  1. 每次调用都新建Scanner还随手关闭,这会把System.in输入流一起关掉,后续其他地方用Scanner会直接报错。
  2. 方法参数name完全没用到,而且不管退货成不成最后都返回null,既浪费参数又不符合方法的返回值预期。

修正后的代码示例

// 假设你的StoreFront里有购物车cart和库存inventory的集合
public SalableProduct returnProduct() {
    // 建议把Scanner改成类成员变量,避免反复创建和关闭
    Scanner scnr = new Scanner(System.in);
    System.out.println("Enter the name of the product you want to return: ");
    String returnProdName = scnr.nextLine();

    // 先去购物车里找要退的商品
    SalableProduct productToReturn = findProductInCart(returnProdName);
    if (productToReturn == null) {
        System.out.println("Item not in cart");
        return null;
    }

    // 执行退货:从购物车移除,放回库存
    removeItemFromCart(productToReturn);
    addItemToInventory(productToReturn);
    System.out.println(productToReturn.getName() + " successfully returned");
    
    return productToReturn;
}

// 辅助方法:在购物车里按名称找商品
private SalableProduct findProductInCart(String productName) {
    // 这里根据你实际的购物车实现写逻辑,比如遍历集合匹配名称
    for (SalableProduct item : cart) {
        if (item.getName().equalsIgnoreCase(productName)) {
            return item;
        }
    }
    return null;
}

核心修复点

  • 删掉递归调用:把returnProduct(returnProd)换成实际的商品查找逻辑,比如新增一个辅助方法去购物车里找商品。
  • Scanner复用:要么把Scanner作为类的成员变量,要么别在这个方法里关闭它,避免搞坏输入流。
  • 优化方法设计:如果需要用户输入就去掉多余的name参数;退货成功返回对应商品,失败返回null,让方法返回值有实际意义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:33:31