Try-catch 创建无限循环[重复]

2024-01-27

我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其稳健,以便用户无法通过输入双精度/整数以外的内容来破坏程序。如果用户确实输入了 double/int 以外的内容。

问题在于它创建了一个循环并重复“请输入有效货币”+“请输入:价格”

 public static double findChange()
{
    System.out.println("\nPlease insert: " + price + " (enter payment amount)");
    initialPrice = price;
    while (payment < price)
    {  
        try{
            payment = kb.nextDouble();
        }
        catch (Exception e)
        {
            System.out.println("Please enter valid currency");
        }
        if (payment > 0){
            totalPayment += payment;
            price -= payment;
            price = (price * 100);
            payment = 0;
        }
        if (totalPayment < initialPrice)
            System.out.println("Please Insert:" + price);
    }

    change = totalPayment - initialPrice;
    change = Math.round(change * 100);
    change = change / 100;
    System.out.println("\nChange Given: $" + change);

    return change;
}

您看到无限循环的原因是您从未从输入中清除无效条目。如果你看the docs https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextDouble%28%29, 它说

如果翻译成功,扫描仪前进超过匹配的输入。

当失败时,你应该打电话kb.next()删除与双精度不匹配的输入,以便您可以继续下一个用户条目。否则,您将不断尝试一遍又一遍地解析相同的无效文本:

catch (Exception e)
{
    System.out.println("Please enter valid currency");
    kb.next();
}

您还可以改进其他一些事情。没有必要使用try and catch在这里,因为您可以使用hasNextDouble方法来检查输入是否有效。如果您确实决定坚持异常处理,那么您应该捕获InputMismatchException而不是通用的Exception,否则您可能会遇到更多问题(例如,如果输入耗尽)。您还可以放一个continue当输入失败时,它不会评估假设您正确读取值的其余代码。

if(kb.hasNextDouble()){
    payment = kb.nextDouble();
} else{
    System.out.println("Please enter valid currency");
    kb.next();
    continue;
}

请注意,您的逻辑仍然存在问题,并且循环永远不会退出(因为payment总是重置为零)。我假设你想做totalPayment < price反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Try-catch 创建无限循环[重复] 的相关文章

随机推荐