我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其健壮,以便用户不能通过输入除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; }
resueman.. 8
您看到无限循环的原因是您永远不会清除输入中的无效输入.它说,如果你看一下这些文档
如果翻译成功,扫描仪将超过匹配的输入.
当它失败时,您应该调用kb.next()
以删除与double不匹配的输入,以便您可以继续下一个用户条目.否则,您将继续尝试一遍又一遍地解析相同的无效文本:
catch (Exception e) { System.out.println("Please enter valid currency"); kb.next(); }
还有一些其他的事情你也可以改进.有没有必要为使用try
和catch
在这里,因为你可以使用的hasNextDouble
方法来检查输入有效.如果您决定坚持使用异常处理,那么您应该捕获InputMismatchException
而不是通用Exception
,否则您可能会遇到更多问题(例如,如果输入已经耗尽).您也可以continue
在输入失败时输入in,这样它就不会评估代码的其余部分,假设您正确读取了值.
if(kb.hasNextDouble()){ payment = kb.nextDouble(); } else{ System.out.println("Please enter valid currency"); kb.next(); continue; }
请注意,您的逻辑仍然存在问题,并且循环将永远不会退出(因为payment
始终会重置为零).我假设你想做totalPayment < price
.
您看到无限循环的原因是您永远不会清除输入中的无效输入.它说,如果你看一下这些文档
如果翻译成功,扫描仪将超过匹配的输入.
当它失败时,您应该调用kb.next()
以删除与double不匹配的输入,以便您可以继续下一个用户条目.否则,您将继续尝试一遍又一遍地解析相同的无效文本:
catch (Exception e) { System.out.println("Please enter valid currency"); kb.next(); }
还有一些其他的事情你也可以改进.有没有必要为使用try
和catch
在这里,因为你可以使用的hasNextDouble
方法来检查输入有效.如果您决定坚持使用异常处理,那么您应该捕获InputMismatchException
而不是通用Exception
,否则您可能会遇到更多问题(例如,如果输入已经耗尽).您也可以continue
在输入失败时输入in,这样它就不会评估代码的其余部分,假设您正确读取了值.
if(kb.hasNextDouble()){ payment = kb.nextDouble(); } else{ System.out.println("Please enter valid currency"); kb.next(); continue; }
请注意,您的逻辑仍然存在问题,并且循环将永远不会退出(因为payment
始终会重置为零).我假设你想做totalPayment < price
.