为什么';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();不要求新的输入?