当用户输入错误的值时,代码会继续进入无限循环

Amr*_*ngh 2 java loops while-loop

我添加了一个while循环,以便在用户输入无效值时,代码将重新提示用户输入有效值.但是当用户输入无效值时,代码进入无限循环.任何帮助将非常感激 !!

public static void main(String[] args) {
    System.out.println("Usage : enter a, b, & c from a quadratic equation");
    System.out.println("        aX^2 +bX + c = 0");
    System.out.println("        Result will be 2 values for X");

    Scanner in = new Scanner(System.in);
    double a = 0;
    double b = 0;
    double c = 0;
    double x1 = 0 ;
    double x2 = 0;
    double discriminant = 0;

    System.out.println("Please enter values for a , b, and c ");

    while(true){
        try
        {
            a = in.nextDouble();
            break;
        }
        catch(java.util.InputMismatchException E)
        {
            System.out.println("wrong input, try again");

        }
    }
    while(true){
        try
        {
            b = in.nextDouble();
            break;
        }
        catch(java.util.InputMismatchException E)
        {

            System.out.println("wrong input, try again");
        }
    }
    while(true){
        try
        {
            c = in.nextDouble();
            break;
        }
        catch(java.util.InputMismatchException E)
        {

            System.out.println("wrong input, try again");
        }
    }
    //x1 = (-b+sqrt(b*b - 4ac))/2a
    //x2 = (-b+sqrt(b*b - 4ac))/2a

    discriminant = b*b -4.0 * a * c;
    x1 = (-b + Math.sqrt(discriminant))/2.0*a;
    x2 = (-b - Math.sqrt(discriminant))/2.0*a;

    System.out.println("The two values for X are " + x1 + " and "  + x2);
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 5

nextDouble方法抛出InputMismatchException,它不消耗导致异常的错误的输入.

如果下一个标记无法转换为有效的double值,则此方法将抛出InputMismatchException.如果翻译成功,扫描仪将超过匹配的输入.

你应该超越不良输入,否则nextDouble将继续一遍又一遍地读取相同的错误输入.

消耗不良输入并将其丢弃in.next(),例如:

catch(java.util.InputMismatchException E)
{
    in.next();
    System.out.println("wrong input, try again");
}
Run Code Online (Sandbox Code Playgroud)