do-while循环新手求助:输入校验循环重复触发两次输入提示问题
解决do-while循环重复触发输入提示的问题
嘿,我懂你现在的困扰——刚学do-while就遇到这种重复提示的坑,确实挺闹心的!咱们先把问题根源搞清楚,再给你两个靠谱的解决方案。
问题出在哪?
先把你没写完的代码补全(应该是类似这样吧?):
Scanner scan = new Scanner(System.in); String input; boolean terminate = true; do { System.out.println("Enter answer: "); input = scan.next(); if(input.trim().equals("x")) { terminate = false; break; } } while (!scan.hasNextInt());
当你输入500的时候,scan.next()已经把这个整数读进input变量里了,这时候Scanner的输入缓冲区是空的。接下来while (!scan.hasNextInt())会让Scanner等待新的输入,于是do循环又执行了一次,再次打印"Enter answer: "——这就是为什么会出现两次提示的原因!
简单说:你先读走了输入,后面的hasNextInt()还在等新东西,导致循环多跑了一轮。
解决方案1:先判断输入类型再读取
这种方法是利用Scanner的hasNextInt()先判断下一个输入是不是整数,避免提前读走输入导致的缓冲区问题:
Scanner scan = new Scanner(System.in); boolean isValidInput; do { System.out.print("Enter answer: "); // 用print代替println,输入和提示在同一行更友好 isValidInput = false; // 先判断是不是整数 if (scan.hasNextInt()) { int userNumber = scan.nextInt(); // 这里可以写你处理整数的逻辑,比如打印、计算啥的 System.out.println("你输入的整数是: " + userNumber); isValidInput = true; } else { // 不是整数就读取字符串,判断是不是x String inputStr = scan.next().trim(); if (inputStr.equalsIgnoreCase("x")) { // 忽略大小写,用户输入X也能生效 System.out.println("程序终止"); isValidInput = true; } else { System.out.println("输入无效!请输入整数或输入'x'退出"); } } } while (!isValidInput);
这个逻辑里,每次循环只处理一次输入:要么是整数直接读取,要么是字符串判断是否为x,不会出现缓冲区空了还在等输入的情况。
解决方案2:读取字符串后尝试转整数
如果你更习惯先读取输入再判断,可以用Integer.parseInt()来尝试把字符串转成整数,失败就说明输入无效:
Scanner scan = new Scanner(System.in); String input; boolean isValidInput; do { System.out.print("Enter answer: "); input = scan.next().trim(); isValidInput = true; // 先判断是不是终止指令x if (input.equalsIgnoreCase("x")) { System.out.println("程序终止"); break; } // 尝试把字符串转成整数 try { int userNumber = Integer.parseInt(input); System.out.println("你输入的整数是: " + userNumber); } catch (NumberFormatException e) { // 转失败说明不是整数,标记为无效 System.out.println("输入无效!请输入整数或输入'x'退出"); isValidInput = false; } } while (!isValidInput);
这种方法不需要依赖Scanner的hasNext系列方法,逻辑更直观,也能完美避免重复提示的问题。
总结一下
核心问题就是Scanner的输入读取和判断顺序错了:你提前用next()把输入读走了,后面的hasNextInt()还在等新输入,导致循环多执行一次。上面两种方法都能解决这个问题,选你觉得更顺手的就行~
内容的提问来源于stack exchange,提问作者Lui H
相关产品推荐
相关产品推荐

