如何处理使用扫描仪无效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块等等。
为了终止这个时间,你需要保护你的同时做另一个逻辑的事情,如:
- 阅读器获取非int字符时退出
- 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代码。 代码被检查并运行正常。