Java 异常和无限循环 //前提条件:提供的数字是正整数 //Postcondition:返回长度为4的整数 公共静态int-validateEnumber(int-num,扫描程序扫描) { 整数=num; 而(数量9999) { 尝试 { System.out.print(“编号必须为4位数字,请重新提供编号:”); number=scan.nextInt();//读取提供的下一个整数 scan.nextLine(); } catch(InputMismatchException e)//如果提供的值不是整数,则输出错误消息 { System.out.println(“输入类型不正确”); } } 返回号码; }

Java 异常和无限循环 //前提条件:提供的数字是正整数 //Postcondition:返回长度为4的整数 公共静态int-validateEnumber(int-num,扫描程序扫描) { 整数=num; 而(数量9999) { 尝试 { System.out.print(“编号必须为4位数字,请重新提供编号:”); number=scan.nextInt();//读取提供的下一个整数 scan.nextLine(); } catch(InputMismatchException e)//如果提供的值不是整数,则输出错误消息 { System.out.println(“输入类型不正确”); } } 返回号码; },java,inputmismatchexception,Java,Inputmismatchexception,假设满足前提条件,则在执行此方法时以及输入 字符串来测试程序,我得到一个无限循环。发生此问题的原因以及如何解决此问题?若要避免引发异常时出现无限循环,必须跳过当前行并转到下一行进行处理。当前,当抛出异常时,您正在重新迭代和扫描再次抛出异常的同一行,因此您被困在无限循环中 我认为您需要在抛出异常时编写scan.nextLine()方法调用 // Precondition: number provided is a positive integer // Postcondition:

假设满足前提条件,则在执行此方法时以及输入
字符串来测试程序,我得到一个无限循环。发生此问题的原因以及如何解决此问题?

若要避免引发异常时出现无限循环,必须跳过当前行并转到下一行进行处理。当前,当抛出异常时,您正在重新迭代和扫描再次抛出异常的同一行,因此您被困在无限循环中

我认为您需要在抛出异常时编写
scan.nextLine()
方法调用

    // Precondition: number provided is a positive integer
    // Postcondition: returns a integer of length 4
     public static int validateNumber(int num, Scanner scan)
{
    int number = num;
    while(number < 1000 || number > 9999)
    {
        try
        {
            System.out.print("Number must be 4 digits long. Please provide the number again: ");
            number = scan.nextInt();    // reads next integer provided                                      
            scan.nextLine();
        }
        catch(InputMismatchException e) //outputs error message if value provided is not an integer
        {
            System.out.println("Incorrect input type.");
        }
    }
    return number;
}

同时修改逻辑以检测数字是否为4位数字。使用整数比较,使用
而不是将数字转换为字符串。

若要避免引发异常时出现无限循环,必须跳过当前行并移到下一行进行处理。当前,当抛出异常时,您正在重新迭代和扫描再次抛出异常的同一行,因此您被困在无限循环中

我认为您需要在抛出异常时编写
scan.nextLine()
方法调用

    // Precondition: number provided is a positive integer
    // Postcondition: returns a integer of length 4
     public static int validateNumber(int num, Scanner scan)
{
    int number = num;
    while(number < 1000 || number > 9999)
    {
        try
        {
            System.out.print("Number must be 4 digits long. Please provide the number again: ");
            number = scan.nextInt();    // reads next integer provided                                      
            scan.nextLine();
        }
        catch(InputMismatchException e) //outputs error message if value provided is not an integer
        {
            System.out.println("Incorrect input type.");
        }
    }
    return number;
}
同时修改逻辑以检测数字是否为4位数字。使用整数比较,而不是将数字转换为字符串。

为什么不使用

catch (InputMismatchException e) // outputs error message if value provided is not an integer
            {
                System.out.println("Incorrect input type.");
                // Moved the nextLine() method call over here
                scan.nextLine();
            }
它看起来更干净,而且可能更高效。

为什么不呢

catch (InputMismatchException e) // outputs error message if value provided is not an integer
            {
                System.out.println("Incorrect input type.");
                // Moved the nextLine() method call over here
                scan.nextLine();
            }

它看起来更干净,可能更有效。

代码看起来不错,但请考虑这一点:

String.valueOf(number)).length() != 4

代码看起来不错,但请考虑这个:

String.valueOf(number)).length() != 4

我能看出一个问题,那就是仔细看你的试接块-

如果输入非整数输入,scanner.nextInt()将抛出InputMissMatchException 控件将到达catch块,因此最终不会为该数字指定新值 所以,再次满足条件,因为它与前面的数字本身进行了检查


如果有效,请尝试。如果无效,请发送您的输入案例,以便我们进行分析,并告诉我们您正在传递的方法中num的初始值。

我可以看到一个问题,请仔细查看您的try-catch块-

如果输入非整数输入,scanner.nextInt()将抛出InputMissMatchException 控件将到达catch块,因此最终不会为该数字指定新值 所以,再次满足条件,因为它与前面的数字本身进行了检查



如果有效,请尝试。如果无效,请发送您的输入案例,以便我们进行分析,并告诉我们您正在传递的方法中num的初始值是多少。

您确认了输入的数字的长度了吗?在为数字指定下一个值以检查其读数后,您是否尝试打印了数字?是否调试它?@Alan您在输入中提供的扫描仪是什么。是新的扫描仪(System.in)@Alan ah。。我现在明白了,只需输入一个数字=scan.nextLine();在异常块中也是如此。您确认输入的数字长度了吗?在为数字指定下一个值以检查其读数是否正常后,是否尝试打印该数字?调试如何?@Alan您在输入中提供的扫描仪是什么。是新的扫描仪(System.in)@Alan ah。。我现在明白了,只需输入一个数字=scan.nextLine();在异常块中也是如此。对更改内容和更改原因的解释不仅仅是代码,更是一个答案:对更改内容和更改原因的解释不仅仅是代码:对不起,这如何解决“方法进入无限循环”的问题对不起,这如何解决“方法进入无限循环”我相信你的意思是3,而不是4。我还担心如果负数进入会发生什么。我相信你的意思是3,而不是4。我还担心如果负数进入会发生什么。