如何处理使用扫描仪无效input引起的无限循环

所以,我陷入了这段代码:

import java.util.InputMismatchException; import java.util.Scanner; public class ConsoleReader { Scanner reader; public ConsoleReader() { reader = new Scanner(System.in); //reader.useDelimiter(System.getProperty("line.separator")); } public int readInt(String msg) { int num = 0; boolean loop = true; while (loop) { try { System.out.println(msg); num = reader.nextInt(); loop = false; } catch (InputMismatchException e) { System.out.println("Invalid value!"); } } return num; } } 

这是我的输出:

插入一个整数:
无效值!
插入一个整数:
无效值!

根据Scanner的javadoc :

当一个扫描器抛出一个InputMismatchExceptionexception时,扫描器将不会传递引起该exception的标记,以便通过其他方法检索或跳过该标记。

这意味着如果下一个标记不是int ,则会抛出InputMismatchException ,但是标记停留在那里。 所以在循环的下一次迭代中, reader.nextInt()再次读取相同的标记并再次抛出exception。 你需要的是使用它。 在catch添加一个reader.next()来使用这个无效的标记,并且需要被丢弃。

 ... } catch (InputMismatchException e) { System.out.println("Invalid value!"); reader.next(); // this consumes the invalid token } 

我要做的就是使用Scanner.nextLine()在整行中读取。 然后创build另一个读取返回的string的扫描器。

 String line = reader.nextLine(); Scanner sc = new Scanner(line); 

这将使你的示例function如下所示:

  public int readInt(String msg) { int num = 0; boolean loop = true; while (loop) { try { System.out.println(msg); String line = reader.nextLine(); Scanner sc = new Scanner(line); num = sc.nextInt(); loop = false; } catch (InputMismatchException e) { System.out.println("Invalid value!"); } } return num; } 

通过这种方式,您可以使用一台扫描仪获取input信息,另一台validation信息,因此,如果input正确的inputforms,您不必担心读者的关心。

你的时间守卫是'循环'variables。

在您的代码到达分配之前引发exception本身= false; 确切地说,在前面的语句中抛出exception,即num = reader.nextInt();

当抛出exception时,'loop'variables的值是'true',但是你的代码跳转到catch块,然后重复while-do。 这个while-do将永远不会停止,因为下一次迭代会再次抛出exception,跳转到catch块等等。

为了终止这个时间,你需要保护你的同时做另一个逻辑的事情,如:

  1. 阅读器获取非int字符时退出
  2. EOF退出

这可以在catch块或其他行中完成。 但是精确的解决scheme取决于你的规格

你也可以试试这个:

  public int readInt(String msg) { int num = 0; try { System.out.println(msg); num = (new Scanner(System.in)).nextInt(); } catch (InputMismatchException e) { System.out.println("Invalid value!"); num = readInt(msg); } return num; } 
 package nzt.nazakthul.app; import java.util.*; public class NztMainApp { public static void main(String[] args) { ReadNumber readObj = new ReadNumber(); readObj.readNumber(); } } class ReadNumber { int no; int readNumber() { Scanner number = new Scanner(System.in); int no=0; boolean b=true; do { try { System.out.print("Enter a number:\t"); no = number.nextInt(); } catch (InputMismatchException e) { System.out.println("No Number"); //e.printStackTrace(); b=false; } } while (b); return no; } } 

我个人使用BufferedReader和InputStreamReader读取string,并检查是否是一个数字,但与扫描仪是less代码。 代码被检查并运行正常。