Java项目读取CSV文件时触发NullPointerException问题排查
解决CSV文件读取时的NullPointerException问题
我有一个CSV文件,使用下方的LeitorDeArquivo类读取其数据用于项目,但运行时出现NullPointerException,看似CSV文件为空,但实际文件存在且路径正确,代码也无明显错误,请问我遗漏了什么?
package main.java.br.com.quantumfinance.selecaoEstagio.leitor; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class LeitorDeArquivo { public List<String> lerArquivo() { try (InputStream resourceAsStream = LeitorDeArquivo.class.getResourceAsStream("/acoes.csv")) { // Leitura do arquivo. BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream)); // ignora a primeira linha br.readLine(); List<String> cotacoes = new ArrayList<>(); String linha; while ((linha = br.readLine()) != null) { cotacoes.add(linha); } return cotacoes; } catch (FileNotFoundException e) { System.out.println("Arquivo não encontrado."); e.printStackTrace(); } catch (IOException e) { System.out.println("Erro de IO."); e.printStackTrace(); } throw new RuntimeException("Erro na leitura do arquivo, consulte o console para maiores detalhes."); } }
运行项目时收到如下错误:
Exception in thread "main" java.lang.NullPointerException at java.base/java.io.Reader.<init>(Reader.java:168) at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:76) at main.java.br.com.quantumfinance.selecaoEstagio.leitor.LeitorDeArquivo.lerArquivo(LeitorDeArquivo.java:17) at main.java.Questoes.main(Questoes.java:26)
项目结构如下:
问题分析与解决方案
核心原因
NullPointerException的本质是resourceAsStream为null,也就是getResourceAsStream("/acoes.csv")没有找到目标文件。这和你认为的"文件存在且路径正确"并不冲突——因为文件虽然存在,但没有被放入项目运行时的classpath中。
从你的项目结构来看,acoes.csv放在了src/main/java目录下,而Java项目的默认构建规则是:仅编译.java文件到classpath输出目录(比如target/classes),其他类型的资源文件不会被自动复制,导致运行时无法通过类加载器找到该文件。
具体解决步骤
- 调整文件存放位置:创建
src/main/resources目录(如果不存在),将acoes.csv移动到这个目录下。Maven、Gradle等主流构建工具会自动将resources目录下的所有文件复制到classpath输出目录,确保运行时能被找到。 - 增加空值校验:在使用
resourceAsStream前添加null判断,避免NPE并给出更精准的错误提示,修改后的代码片段如下:
try (InputStream resourceAsStream = LeitorDeArquivo.class.getResourceAsStream("/acoes.csv")) { if (resourceAsStream == null) { throw new FileNotFoundException("Arquivo acoes.csv não encontrado no classpath"); } BufferedReader br = new BufferedReader(new InputStreamReader(resourceAsStream)); // 后续读取逻辑不变 }
- 验证资源是否生效:运行项目前,检查
target/classes目录下是否存在acoes.csv,确认资源文件已被正确复制。
内容的提问来源于stack exchange,提问作者Marco Aurélio Lopes Júnior
相关产品推荐
相关产品推荐

