Java读取txt文件仅输出第二行 数组越界异常排查
问题根因
你碰到的java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1异常,核心原因是某一行文本按逗号分割后得到的字符串数组长度只有1,但是Forensic.java第28行代码尝试访问数组索引为1的第二个元素,直接触发越界。
之前程序只输出第二行数据,本质也是行读取逻辑错位,没有逐行正确读到所有有效账单行。
常见触发场景
- Bill.txt文件中存在空行、无逗号的脏数据行(比如漏写分隔符的单行备注、误输入的零散字符),这类行调用
split(",")后返回的数组长度天然为1,访问非0索引就会报错 - Scanner读取逻辑混用了
next()/nextInt()和nextLine()方法:前者不会读取行尾的换行符,会导致后续nextLine()读到空的残行,split后数组长度不符合预期 - 分割逻辑没有做兼容:如果逗号前后存在空格、或者行首尾存在多余分隔符,没有做trim处理时,可能出现列解析错位,极端场景下也会触发长度不足的越界
排查&修复步骤
- 先定位Forensic.java第28行的代码逻辑,确认该行是读取cols数组的哪个固定索引(比如取支付金额、付款方名称的列),明确你的账单单条记录最少需要多少列
- 在逐行split的逻辑前,加一行调试代码打印当前读到的原始行内容,快速定位是哪一行读取出错:
String line = sc.nextLine(); // 调试用,定位完问题可以删掉 System.out.printf("当前行内容:%s,split后长度:%d%n", line, line.split(",").length); - 读取时增加两层校验,避免脏数据中断程序:
- 跳过trim后为空的空行
- split后先判断数组长度是否满足最小列数要求,不满足的行打印提示后直接跳过
- 修正循环逻辑:用
while(sc.hasNextLine())做外层循环是正确写法,循环内部必须全程用nextLine()读取整行,不要混用其他Scanner读取方法,避免行错位。
参考实现代码
import java.io.File; import java.io.FileNotFoundException; import java.io.PrintWriter; import java.util.Scanner; public class Forensic { public static void main(String[] args) throws FileNotFoundException { // 替换为你实际的金额阈值 final double AMOUNT_THRESHOLD = 500.0; Scanner sc = new Scanner(new File("Bill.txt")); PrintWriter pw = new PrintWriter(new File("BelowAmount.txt")); while (sc.hasNextLine()) { // 读取整行并去掉首尾空白字符 String rawLine = sc.nextLine().trim(); // 跳过空行 if (rawLine.isEmpty()) { continue; } // 按逗号分割,兼容逗号前后的空格 String[] cols = rawLine.split(",\\s*"); // 替换为你的账单实际列数,比如账单共4列就判断长度<4 if (cols.length < 4) { System.out.println("跳过格式不合法的行:" + rawLine); continue; } // 解析金额,注意替换为金额对应的实际索引,比如第3列就填2(索引从0开始) double payAmount; try { payAmount = Double.parseDouble(cols[2].trim()); } catch (NumberFormatException e) { System.out.println("跳过金额格式错误的行:" + rawLine); continue; } // 符合金额阈值要求的行格式化写入文件 if (payAmount < AMOUNT_THRESHOLD) { // 按你需要的列宽调整格式化规则,示例为每列左对齐占18字符 pw.printf("%-18s%-18s%-10.2f%-18s%n", cols[0].trim(), cols[1].trim(), payAmount, cols[3].trim()); } } // 关闭流 sc.close(); pw.close(); } }
内容的提问来源于stack exchange,提问作者Shazwani Rashid
相关产品推荐
相关产品推荐

