Try-catch创建无限循环

时间:2015-12-15 15:19:25

标签: java try-catch infinite-loop

我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其健壮,以便用户不能通过输入除double / integer之外的其他内容来破坏程序。如果用户输入的内容不是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;
}

2 个答案:

答案 0 :(得分:8)

您看到无限循环的原因是您永远不会清除输入中的无效输入。如果你看the docs,就说

  

如果翻译成功,则扫描程序会超过匹配的输入。

如果失败,您应该调用kb.next()来删除与double不匹配的输入,以便您可以继续下一个用户条目。否则,您将一直尝试一遍又一遍地解析相同的无效文本:

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

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

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

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

答案 1 :(得分:0)

由于您希望它识别任何输入,但只使用双打,请尝试Double.parseDouble(String)。我还将其余的逻辑移到了try块,因为它只应在收到有效输入时发生。如果它无法解析双精度数,则会在不尝试其余逻辑的情况下突破并再次尝试。

while (payment < price && price > 0){
    try{
        payment = Double.parseDouble(kb.next());
        if (payment > 0){
            totalPayment += payment;
            price -= payment;
            price = (price * 100); 
            payment = 0;
        }
        if (totalPayment < initialPrice){
            System.out.println("Please Insert:" + price);
        }
    }
    catch (Exception e) {
        System.out.println("Please enter valid currency");
    }
}