当前位置: 首页 > 知识库问答 >
问题:

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

邴修远
2023-03-14

添加了一个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);
}

共有2个答案

翟修明
2023-03-14

以上建议会起作用。但是,你需要检查判别式。当判别式小于零时,您不处理该案例。如果判别式是负的,你将得到NaN作为根。更多细节请参考Math.sqrt()文档。

//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;
黄信厚
2023-03-14

当< code>nextDouble方法抛出< code > InputMismatchException 时,它不会使用导致异常的错误输入。

如果下一个令牌无法转换为有效的双精度值,则此方法将引发 InputMismatchException。如果翻译成功,扫描程序将前进到匹配的输入。

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

使用< code>in.next()消耗错误的输入并丢弃它,例如:

catch(java.util.InputMismatchException E)
{
    in.next();
    System.out.println("wrong input, try again");
}
 类似资料:
  • 我的问题是,当我输入一个字母时,它会进入无限循环,不会提示用户输入数量。。。。那是 输入数量:无效数量请输入数字! 输入数量:无效数量请输入数字! 输入数量:无效数量请输入数字!......

  • 问题内容: 我有一个无限的while循环,我想在用户按下某个键时退出。通常,我用来获取用户的响应。但是,我不必等待响应。我想要这样的东西: 这应该很简单,但是我似乎无法弄清楚。我倾向于使用线程的解决方案,但我不想这样做。我该怎么做? 问题答案: 我认为您可以使用msvcrt做得更好: 可悲的是,仍然是特定于Windows的。

  • 我在while循环中遇到了这个问题: 这个while循环只接受一次输入,不会再次请求它,所以它会循环整个时间接受一次该输入。我在这里做错了什么,因为对我来说,这个诡计循环真的很奇怪? InputHandler类:

  • 我正在编写一个代码,生成一个随机数,然后将这个数字分配给字符串字母中的一个字母,然后用户必须猜测该字母。 我正在尝试循环问题“Enter one lowercase letter”:如果用户输入的字母与不匹配,但同时我必须确保该字母都是小写的(这是我们在课堂上没有学到的,但经过搜索我找到了一个解决方案,希望这是正确的方法)。 如果用户输入不正确的低字母,则循环结束。当与匹配时,它确实起作用。 我要

  • 我试图在返回Object的方法中简单地从用户获得输入。由于某种原因,将引发此错误: 线程“main”java.lang.reflect.invocationTargetException在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.invoke0(原生方法)在java.base/jdk.internal.reflect.nativ