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

开发信用卡信息CSV阅读器时遭遇NullPointerException问题求助

问题分析与修复方案

1. 空指针异常的根本原因

你的scanner()方法里,先执行读取循环,后初始化Scanner对象。在调用s.nextLine()时,成员变量s还处于null状态,直接触发NullPointerException,这就是报错的核心原因。

2. 修复空指针+统计交易总数

调整scanner()方法的代码顺序,先完成Scanner初始化,再执行读取循环:

public void scanner() {
    int numTransactions = 0;
    // 先初始化Scanner,放在循环之前
    try {
        s = new Scanner(new File("visadata.txt"));
    } catch (FileNotFoundException e) {
        System.out.println("文件未找到");
        return; // 文件找不到直接退出,避免后续空指针
    }

    // 用hasNextLine()判断更简洁,无需手动处理NoSuchElementException
    while (s.hasNextLine()) {
        s.nextLine();
        numTransactions++;
    }
    System.out.println("交易总数: " + numTransactions);
    s.close(); // 用完关闭Scanner,避免资源泄漏
}

3. 完成完整需求(借记/贷记统计+借记总额)

结合你的getTokens方法解析每行CSV数据,假设CSV结构中某列对应交易类型、某列对应金额(根据你的实际CSV调整索引),修改代码如下:

public void scanner() {
    int totalTransactions = 0;
    int debitCount = 0;
    int creditCount = 0;
    double debitTotal = 0.0;

    try {
        s = new Scanner(new File("visadata.txt"));
        // 如果CSV有表头,取消下面注释跳过第一行
        // s.nextLine();
    } catch (FileNotFoundException e) {
        System.out.println("文件未找到");
        return;
    }

    while (s.hasNextLine()) {
        String line = s.nextLine();
        totalTransactions++;
        String[] tokens = getTokens(line);
        
        // 假设tokens[2]是交易类型(如"借记"/"贷记"),tokens[3]是交易金额
        String type = tokens[2].trim();
        try {
            double amount = Double.parseDouble(tokens[3].trim());
            if ("借记".equals(type)) {
                debitCount++;
                debitTotal += amount;
            } else if ("贷记".equals(type)) {
                creditCount++;
            }
        } catch (NumberFormatException e) {
            System.out.println("第" + totalTransactions + "行金额格式错误,跳过");
        }
    }

    // 输出最终统计结果
    System.out.println("交易总数: " + totalTransactions);
    System.out.println("借记交易数量: " + debitCount);
    System.out.println("贷记交易数量: " + creditCount);
    System.out.println("借记交易总额: " + debitTotal);
    s.close();
}

额外优化建议

  • 类名csvReader改成CsvReader,符合Java大驼峰命名规范;
  • getTokens方法无需设为static,改成非静态方法更符合面向对象逻辑;
  • 复杂CSV解析建议用成熟库(如OpenCSV),避免自己写的解析逻辑遗漏边界场景(比如引号内的换行内容)。

内容的提问来源于stack exchange,提问作者Kyle Tse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:35:25