Java使用Scanner读文件时while循环计数器i不递增问题求助
问题原因
你遇到的计数器无法正常递增的核心问题是变量初始化位置错误:
i = 0的赋值语句被放在了while循环内部,这意味着每一轮循环执行的第一步都会将i重置为0,哪怕你在循环末尾执行了i++操作,下一轮循环开始时i还是会被重新赋值为0,因此你每次打印i得到的结果都是0。- 你后续将i的赋值语句移到while循环外部的操作是正确的,计数器初始化逻辑只需要在循环开始前执行一次即可。
额外优化建议
你的代码还有两处容易触发后续问题的点,可以提前调整:
- Scanner资源关闭逻辑优化:当前你仅在catch块中关闭Scanner,如果代码正常执行完没有抛出异常,Scanner资源会一直处于未关闭状态造成资源泄漏。建议使用Java 7及以上支持的try-with-resources语法自动关闭资源,示例如下:
File file = new File("Reservation.txt"); // 写在try括号内的资源会在代码块执行结束后自动关闭,无需手动调用close try (Scanner sc = new Scanner(file)) { sc.useDelimiter(","); int i = 0; // 计数器初始化放在循环外 while (sc.hasNext()) { // 你的业务逻辑 i++; } } catch (NoSuchElementException e) { System.out.println("==============================="); }
- 对象引用覆盖问题修正:你当前代码中
newRes[i] = readRec的写法会让数组所有元素都指向同一个readRec对象,后续循环修改readRec的属性时,数组中之前存入的所有元素的属性也会被同步覆盖。建议每次循环都新建一个对应的实例对象:
while (sc.hasNext()) { // 每次循环新建独立的实例,避免引用共享导致的数据覆盖 Reservation readRec = new Reservation(); newRes[i] = readRec; // 后续属性赋值、打印逻辑不变 i++; }
内容的提问来源于stack exchange,提问作者Leonardo DaFishy
相关产品推荐
相关产品推荐

