Try-catch 创建无限循环
Try-catch creates infinite loop
我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其健壮,以便用户无法通过输入 [= 以外的内容来破坏程序17=]。如果用户确实输入了 double/int.
以外的内容
问题是它创建了一个循环并重复 "Please enter valid currency" + "Please enter: price"
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,它说
If the translation is successful, the scanner advances past the input that matched.
失败时,您应该调用 kb.next()
删除不匹配双精度的输入,以便您可以继续下一个用户输入。否则,您将不断尝试一遍又一遍地解析相同的无效文本:
catch (Exception e)
{
System.out.println("Please enter valid currency");
kb.next();
}
您还可以改进其他一些事情。这里不需要使用 try
和 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
。
既然你想让它识别任何输入,但只使用双打,试试Double.parseDouble(String)
。我还将其余逻辑移到了您的 try 块中,因为它只应在收到有效输入时发生。如果它不能解析 double,它会在不尝试其余逻辑的情况下中断并重试。
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");
}
}
我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其健壮,以便用户无法通过输入 [= 以外的内容来破坏程序17=]。如果用户确实输入了 double/int.
以外的内容问题是它创建了一个循环并重复 "Please enter valid currency" + "Please enter: price"
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,它说
If the translation is successful, the scanner advances past the input that matched.
失败时,您应该调用 kb.next()
删除不匹配双精度的输入,以便您可以继续下一个用户输入。否则,您将不断尝试一遍又一遍地解析相同的无效文本:
catch (Exception e)
{
System.out.println("Please enter valid currency");
kb.next();
}
您还可以改进其他一些事情。这里不需要使用 try
和 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
。
既然你想让它识别任何输入,但只使用双打,试试Double.parseDouble(String)
。我还将其余逻辑移到了您的 try 块中,因为它只应在收到有效输入时发生。如果它不能解析 double,它会在不尝试其余逻辑的情况下中断并重试。
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");
}
}