开发信用卡信息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
相关产品推荐
相关产品推荐

