You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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处理时,可能出现列解析错位,极端场景下也会触发长度不足的越界

排查&修复步骤

  1. 先定位Forensic.java第28行的代码逻辑,确认该行是读取cols数组的哪个固定索引(比如取支付金额、付款方名称的列),明确你的账单单条记录最少需要多少列
  2. 在逐行split的逻辑前,加一行调试代码打印当前读到的原始行内容,快速定位是哪一行读取出错:
    String line = sc.nextLine();
    // 调试用,定位完问题可以删掉
    System.out.printf("当前行内容:%s,split后长度:%d%n", line, line.split(",").length);
    
  3. 读取时增加两层校验,避免脏数据中断程序:
    • 跳过trim后为空的空行
    • split后先判断数组长度是否满足最小列数要求,不满足的行打印提示后直接跳过
  4. 修正循环逻辑:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:18:54