如何通过循环遍历字符串直至末尾?解决Scanner循环重复问题
问题根因
- 无限循环的核心诱因是循环逻辑缺失元素消费动作:
Scanner.hasNext()仅检查输入源是否存在可读取的下一个标记,不会移动内部扫描指针。若循环体中没有调用next()、nextInt()这类读取方法消费当前标记,指针会一直停在初始位置,hasNext()将持续返回true,触发无限重复处理逻辑的异常。 - 目标字符串末尾带空格的场景不会触发该问题:Scanner默认会自动忽略前后、末尾的空白分隔符,该场景和死循环无关联。
正确实现方案
while循环实现(推荐)
String myString = "5 6 7 8 9 2 3 "; // 基于目标字符串初始化Scanner实例 Scanner myScanner = new Scanner(myString); // 使用try-with-resources语法自动释放Scanner资源,避免资源泄漏 try (myScanner) { // 遍历数值元素时,优先用hasNextInt()做前置类型校验 while (myScanner.hasNextInt()) { // 调用nextInt()读取当前标记,推动扫描指针向后移动 int currentValue = myScanner.nextInt(); // 在此处补充业务逻辑,例如数值计算、结果存储等 System.out.println("当前遍历值:" + currentValue); } }
for循环实现(等价遍历逻辑)
String myString = "5 6 7 8 9 2 3 "; Scanner myScanner = new Scanner(myString); try (myScanner) { // for循环将遍历判断、元素读取拆分,实现和while完全一致的遍历效果 for (int currentValue; myScanner.hasNextInt();) { currentValue = myScanner.nextInt(); // 业务逻辑 System.out.println("当前遍历值:" + currentValue); } }
实现注意事项
- 循环体必须显式调用
next系列方法完成元素消费,否则扫描指针不会移动,必然触发无限循环。 - 若需要遍历的元素类型不统一,可将判断条件改回通用的
hasNext(),配合next()读取字符串标记即可。 - 若字符串内的分隔符不是默认的空白字符,需要通过
myScanner.useDelimiter("指定分隔符")手动配置拆分规则,避免标记拆分错误。
常见排查方向
- 检查是否误将绑定控制台输入的
Scanner(System.in)用到字符串遍历场景:绑定标准输入的Scanner会持续阻塞等待用户输入,不会自动结束循环,和字符串遍历的逻辑不兼容。 - 检查是否在循环内嵌套异常处理逻辑时遗漏了当前标记跳过步骤:比如读取异常时没有消费当前无效标记,导致Scanner始终停留在同一个报错位置,出现反复处理同一内容的现象。
内容的提问来源于stack exchange,提问作者BusinessMindedAutodidact
相关产品推荐
相关产品推荐

