Scanner输入验证问题:双单词单空格输入校验的do-while循环逻辑异常排查
Java do-while循环校验双词输入逻辑错误排查与修复
咱们先拆解下你这段代码里的几个核心问题,正是这些问题导致不管输入对不对都会让你输两次然后直接输出Correct:
问题1:索引变量未在循环内更新
你在循环外面只计算了一次i1和i2,之后在循环里更新了phrase,但完全没重新计算这两个索引值。这就意味着循环判断的i2 != -1一直用的是第一次输入的结果,完全没跟上后续输入的变化,等于循环条件根本没起到校验作用。
问题2:do-while的执行顺序逻辑颠倒
do-while是先执行循环体,再判断条件。你一开始已经让用户输入了一次phrase,然后直接进入do循环,不管第一次输入对不对,都会先打印提示让用户再输一次——这就是为什么会强制两次输入的原因。
问题3:校验条件不完整
你只判断了是否存在第二个空格,但没覆盖这些不符合要求的情况:
- 输入里完全没有空格(比如只输入一个单词)
- trim之后的字符串是空的(比如用户只输入空格)
- 第一个空格之后没有内容(比如输入
hello,trim后是hello,还是单单词)
修复后的完整代码
下面是调整后的代码,我把校验逻辑封装成了一个判断方法,这样代码更清晰,也能确保每次输入后都重新做校验:
import java.util.Scanner; public class TwoWordChecker { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String phrase; // 初始输入提示 System.out.print("Enter a two word phrase with one space: "); phrase = sc.nextLine().trim(); // 校验不通过则循环提示重新输入 while (!isValidTwoWordPhrase(phrase)) { System.out.print("Invalid input! Enter a two word phrase with one space, try again: "); phrase = sc.nextLine().trim(); } System.out.println("Correct"); sc.close(); } // 封装校验逻辑:确保有且仅有一个空格,且空格前后都有有效内容 private static boolean isValidTwoWordPhrase(String phrase) { int firstSpaceIndex = phrase.indexOf(" "); return firstSpaceIndex != -1 && firstSpaceIndex != 0 && firstSpaceIndex != phrase.length() - 1 && phrase.indexOf(" ", firstSpaceIndex + 1) == -1; } }
修复要点说明
- 封装校验方法:每次输入后都调用方法重新判断,确保用的是最新的输入内容
- 改用while循环:先判断初始输入是否正确,不正确再进入循环提示,避免强制两次输入的问题
- 完善校验条件:覆盖所有不符合「word1 空格 word2」格式的情况
如果你坚持要用do-while,也可以调整成这样(把初始输入移到循环内):
import java.util.Scanner; public class TwoWordCheckerDoWhile { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String phrase; boolean isValid; do { System.out.print("Enter a two word phrase with one space: "); phrase = sc.nextLine().trim(); int firstSpaceIndex = phrase.indexOf(" "); isValid = firstSpaceIndex != -1 && firstSpaceIndex != 0 && firstSpaceIndex != phrase.length() - 1 && phrase.indexOf(" ", firstSpaceIndex + 1) == -1; if (!isValid) { System.out.println("Invalid input! Try again."); } } while (!isValid); System.out.println("Correct"); sc.close(); } }
这样不管用while还是do-while,都能正确实现「输入错误就重新询问,直到输入正确」的逻辑啦。
内容的提问来源于stack exchange,提问作者lauriefire
相关产品推荐
相关产品推荐

