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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:25:21