Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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
为什么';t scanner在try-catch-while循环java中请求其他输入_Java_Exception Handling_Double_Java.util.scanner - Fatal编程技术网

为什么';t scanner在try-catch-while循环java中请求其他输入

为什么';t scanner在try-catch-while循环java中请求其他输入,java,exception-handling,double,java.util.scanner,Java,Exception Handling,Double,Java.util.scanner,假设我需要不断询问用户,直到他输入一个double 我所做的是使用while循环并检查是否存在异常 如果有异常,我会去请求下一个输入 double bal = 0; Scanner sc = new Scanner(System.in); while (true) { try { System.out.println("Enter the balance"); bal = sc.nextDouble(); break; }

假设我需要不断询问用户,直到他输入一个
double

我所做的是使用while循环并检查是否存在异常

如果有异常,我会去请求下一个输入

double bal = 0;
Scanner sc = new Scanner(System.in);
while (true) {
    try {
        System.out.println("Enter the balance");
        bal = sc.nextDouble();
        break;
        } catch (Exception e) {
          System.out.println("That isn't a number");
    }
}
System.out.println("Bal is " + bal);
sc.close();
但是,如果我输入一个非双精度,那么它不会要求下一个输入,而是继续打印以无限循环结束的那两行

Enter the balance
XYZ
That isn't a number
Enter the balance
That isn't a number
Enter the balance
That isn't a number
Enter the balance
That isn't a number
....

我缺少的是什么?

您需要通过调用catch块中的
sc.next()
放弃流中以前的输入。遗憾的是,当输入失败时,扫描仪不会自动执行此操作。

使用
sc.next()
放弃错误的输入:

while (true) {
    try {
        System.out.println("Enter the balance");
        bal = sc.nextDouble();
        break;
    } catch (InputMismatchException e) {
        System.out.println("That isn't a number");
        sc.next();
    }
}

我还建议捕获特定的异常(
inputmaschException
)。这样,如果出现其他问题(例如,标准输入流关闭),您就不会错误地打印“那不是一个数字”。

来自
nextDouble
文档:

如果翻译成功,扫描仪将通过匹配的输入

因此,当输入不匹配时,扫描器不会前进超过它。因此,下一次迭代执行
nextDouble
时,输入尚未清除,它仍将读取相同的输入

当您失败时,您应该通过读取
next()
来推进输入,或者将输入读取为字符串并尝试解析结果,这样即使该值非法,输入已被清除,下一次迭代您也可以读取新的值/输入:

public static void main(String[] args) {
    double bal = 0;
    Scanner sc = new Scanner(System.in);
    while (true) {
        try {
            System.out.println("Enter the balance");
            bal = Double.parseDouble(sc.next());
            break;
            } catch (Exception e) {
              System.out.println("That isn't a number");
        }
    }
    System.out.println("Bal is " + bal);
    sc.close();
}

(和其他)的可能重复。此外,捕获异常可能不是处理控制流的最佳方式。您可以(也可能应该)使用hasNextDoubleinstead@yshavit我还使用了
hasNextDouble()
它也以无限循环结束。我不知道该放弃那个输入。所以我想问为什么会这样。这只是一个说明情况的例子。。我只是面对这个问题,以前从未面对过。你能在这里详细解释一下吗?所以,如果我有一个=scanner.nextInt();在try块中,我故意希望发生异常(这一切都在进行中),为什么a=scanner.nextInt();不要求新的输入?