Java Try-catch创建无限循环
我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其健壮,以便用户不能通过输入双精度/整数以外的内容来破坏程序。如果用户输入的不是double/int 问题是它创建了一个循环并重复“请输入有效货币”+“请输入:价格”Java Try-catch创建无限循环,java,try-catch,infinite-loop,Java,Try Catch,Infinite Loop,我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其健壮,以便用户不能通过输入双精度/整数以外的内容来破坏程序。如果用户输入的不是double/int 问题是它创建了一个循环并重复“请输入有效货币”+“请输入:价格” publicstaticdoublefindchange() { System.out.println(“\n请插入:“+price+”(输入付款金额)”); 初始价格=价格; 同时(付款0){ 总付款+=付款; 价格-=付款; 价格=(价格*100); 付款=0; } 如
publicstaticdoublefindchange()
{
System.out.println(“\n请插入:“+price+”(输入付款金额)”);
初始价格=价格;
同时(付款<价格)
{
试一试{
payment=kb.nextDouble();
}
捕获(例外e)
{
System.out.println(“请输入有效货币”);
}
如果(付款>0){
总付款+=付款;
价格-=付款;
价格=(价格*100);
付款=0;
}
如果(总付款<初始价格)
System.out.println(“请插入:“+价格”);
}
变更=总付款-初始价格;
更改=数学四舍五入(更改*100);
改变=改变/100;
System.out.println(“\n给定的更改:$”+更改);
回报变化;
}
您看到无限循环的原因是您从未从输入中清除无效条目。如果你看,它说
如果翻译成功,则扫描仪将通过匹配的输入
当它失败时,您应该调用kb.next()
,删除与double不匹配的输入,以便继续下一个用户条目。否则,您将不断尝试反复分析相同的无效文本:
catch (Exception e)
{
System.out.println("Please enter valid currency");
kb.next();
}
你还可以改进其他一些事情。这里不需要使用try
和catch
,因为您可以使用hasNextDouble
方法检查输入是否有效。但是,如果您决定坚持异常处理,则应该捕获输入不匹配异常
,而不是一般的异常
,否则您可能会遇到更多问题(例如,如果输入耗尽)。您还可以在输入失败时放入一个continue
,这样它就不会计算假定您正确读取值的其余代码
if(kb.hasNextDouble()){
payment = kb.nextDouble();
} else{
System.out.println("Please enter valid currency");
kb.next();
continue;
}
请注意,您的逻辑仍然存在问题,循环将永远不会退出(因为
payment
总是重置为零)。我假设您想做的是totalPayment
。因为您想让它识别任何输入,但只使用双精度,请尝试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");
}
}
while(付款0){
试一试{
payment=Double.parseDouble(kb.next());
如果(付款>0){
总付款+=付款;
价格-=付款;
价格=(价格*100);
付款=0;
}
如果(总付款<初始价格){
System.out.println(“请插入:“+价格”);
}
}
捕获(例外e){
System.out.println(“请输入有效货币”);
}
}
价格=(价格*100)代码>不确定此行的原因是什么。。。基本上,你每次都会把价格设置得更高,这可能意味着用户永远不会完成付款。只有当你能够处理异常并将其打印到屏幕上时,你才应该捕获异常,就像假装它没有发生一样,它没有处理或从这种情况中恢复。
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");
}
}