Java Scannerexception处理

我想从用户那里收到一个Double,并处理在用户没有输入double / int的情况下引发的exception; 在这种情况下,我想要求用户再次插入金额。 如果捕获到exception,我的代码会陷入循环,并继续打印“插入金额”。

private static double inputAmount() { Scanner input = new Scanner(System.in); while (true) { System.out.println("Insert amount:"); try { double amount = input.nextDouble(); return amount; }catch (java.util.InputMismatchException e) {continue;} } } 

先谢谢你。

当遇到无效输入时,您的程序会进入无限循环,因为nextDouble()不会使用无效的令牌。 因此,无论引起exception的任何令牌都将保留在那里,并在下次尝试读取双精度时继续引发exception。

这可以通过在catch块中放入nextLine()next()调用来解决,以消耗导致抛出exception的任何输入,清除输入流并允许用户再次输入内容。

原因是它一遍又一遍地读取相同的值,所以每次都以catch子句结束。

你可以试试这个:

 private static double inputAmount() { Scanner input = new Scanner(System.in); while (true) { System.out.println("Insert amount:"); try { return input.nextDouble(); } catch (java.util.InputMismatchException e) { input.nextLine(); } } } 

这是因为在捕获到exception后,它会停留在scanner对象的缓冲区中。 因此它继续抛出exception但是由于你使用continue处理它,它将在循环中运行。 尝试调试程序以获得更好的视图。

此方法继续执行相同的输入标记,直到找到行分隔符,即input.nextLine()input.next()

查看以下代码

 private static double inputAmount() { Scanner input = new Scanner(System.in); while (true) { System.out.println("Insert amount:"); try { double amount = input.nextDouble(); return amount; } catch (java.util.InputMismatchException e) { input.nextLine(); } } }