Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 - Fatal编程技术网

Java在使用Try/Catch时陷入无限循环

Java在使用Try/Catch时陷入无限循环,java,try-catch,Java,Try Catch,对于学校的一个项目,我试图使用try/catch来防止当用户输入字母而不是所需的输入类型(即双精度输入)时程序崩溃 公共静态双输入端(){ 扫描仪输入=新扫描仪(系统输入); 双面=-1; 做{ 试一试{ System.out.println(“输入边长(单位):”; side=in.nextDouble(); } 捕获(输入不匹配异常e){ System.out.println(“必须输入编号”); } }而(侧

对于学校的一个项目,我试图使用try/catch来防止当用户输入字母而不是所需的输入类型(即双精度输入)时程序崩溃

公共静态双输入端(){
扫描仪输入=新扫描仪(系统输入);
双面=-1;
做{
试一试{
System.out.println(“输入边长(单位):”;
side=in.nextDouble();
}
捕获(输入不匹配异常e){
System.out.println(“必须输入编号”);
}
}而(侧<0);
返回侧;
}

当我执行这段代码时,它陷入了一个循环中,它无限次地输出“输入边长(单位):”和“必须输入数字”。我不熟悉使用try/catch,所以我可能对这种行为并不熟悉。无论如何,如果有人能帮我解决这个问题,我将不胜感激。提前感谢。

如果输入错误,您必须释放缓冲区,在
catch
块中添加以下行:

in.next();
一切都应该起作用:

public static double inputSide () {
    Scanner in = new Scanner(System.in);
    double side = -1;
    do {
        try {
            System.out.println("Enter a side length (in units):");
            side = in.nextDouble();
        }
        catch(InputMismatchException e){
            System.out.println("Must input number");
            //this line frees the buffer
            in.next();
        }
    } while (side < 0);
    return side;
}

而不是试抓块

非常感谢!我正在研究in.hasNextDouble()方法。@ClementHoang,不客气!看一看,您会发现对于每种数据类型都有大量的
Scanner#hastnextwhatever()
,因此您不需要try-catch块。我不记得如果你的输入是错误的,它是否也需要释放缓冲区,如果它通过一个无限循环,它和try-catch是同一个问题,你用我的答案解决它!如果这是最适合你的,请点击答案左边的“V”符号来“勾选”它:)供其他阅读者阅读。这是因为当调用异常时,扫描程序不会移动到下一个输入标记,而是尝试再次读取它。添加非数据类型特定的.next()将转到下一个标记。
public static double inputSide () {
    Scanner in = new Scanner(System.in);
    double side = -1;
    do {
        try {
            System.out.println("Enter a side length (in units):");
            side = in.nextDouble();
        }
        catch(InputMismatchException e){
            System.out.println("Must input number");
            //this line frees the buffer
            in.next();
        }
    } while (side < 0);
    return side;
}
if(in.hasNextDouble()){
    //read
}