Java使用ArrayList录入整数遇非整数停止时出现无限循环问题
问题根因
你的代码出现无限循环是几个逻辑错误共同导致的:
accumulating变量在循环外仅赋值一次,进入循环后从未更新。只要第一次判断输入是整数,这个变量就永远是true,循环条件永远成立。- 循环体内部仅重复添加第一次读取到的固定值
i,既没有读取新的用户输入,也没有重新校验输入类型,循环没有任何终止出口。 - 代码没有对首次输入做类型校验,如果用户第一次输入就传入非整数,会直接抛出
InputMismatchException,完全达不到“遇到非整数自动终止”的需求。 - 额外的规范问题:使用了无泛型的原始类型
ArrayList,存在类型安全隐患。
可直接运行的修正代码
import java.util.ArrayList; import java.util.Scanner; public class Tryout1 { public static void main(String[] args) { ArrayList<Integer> entries = new ArrayList<>(); Scanner scanner = new Scanner(System.in); System.out.println("enter numbers"); // 每次循环启动前先校验下一个输入是否为整数 while (scanner.hasNextInt()) { int currentNum = scanner.nextInt(); entries.add(currentNum); } System.out.println(entries); scanner.close(); } }
修正逻辑说明
- 移除了存固定值的
accumulating标记,把hasNextInt()校验直接放在循环条件位,每次循环都会读取最新的输入状态做判断,不会出现条件永远为真的问题。 - 每次校验通过后才读取当前输入的整数存入列表,不会重复添加同一个值。
- 只要检测到非整数输入,
hasNextInt()会直接返回false终止循环,不需要额外做异常捕获就能实现需求。 - 给
ArrayList指定了Integer泛型,消除类型安全警告,用完Scanner后主动关闭符合资源使用规范。
内容的提问来源于stack exchange,提问作者Emye22
相关产品推荐
相关产品推荐

