Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Try-catch创建无限循环_Java_Try Catch_Infinite Loop - Fatal编程技术网

Java Try-catch创建无限循环

Java Try-catch创建无限循环,java,try-catch,infinite-loop,Java,Try Catch,Infinite Loop,我需要能够接受用户输入,直到输入大于初始价格,但我还需要使其健壮,以便用户不能通过输入双精度/整数以外的内容来破坏程序。如果用户输入的不是double/int 问题是它创建了一个循环并重复“请输入有效货币”+“请输入:价格” publicstaticdoublefindchange() { System.out.println(“\n请插入:“+price+”(输入付款金额)”); 初始价格=价格; 同时(付款0){ 总付款+=付款; 价格-=付款; 价格=(价格*100); 付款=0; } 如

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

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

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");
    }
}