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

Java Jar运行报错:无法找到指定路径下的CSV文件

问题解决方案

核心问题分析

  1. 文件找不到:运行Jar包时,src/main/books.csv是开发阶段的本地文件系统路径,但Jar是压缩包,内部资源无法通过File类直接访问——File只能读取文件系统中的实体文件,而非Jar包内的内嵌资源。
  2. 空指针异常:文件读取失败后scanner变量保持null,代码未做判空就直接调用scanner.hasNext(),触发空指针。

具体修复步骤

1. 调整资源文件存放位置

将books.csv、teacher.csv、users.csv移动到项目的src/main/resources目录下(Maven/Gradle标准资源目录,打包时会自动将该目录下的文件放入Jar包的类路径根目录)。

2. 修改文件路径配置

更新Main类中的路径定义,直接使用资源文件名(资源已在类路径根目录):

public class Main {
    public static void main(String[] args) throws IOException {
        String[] dirs = {"books.csv", "teacher.csv", "users.csv"};
        Library library = new Library(dirs); 

        new HomePage(library); 
    }
}

3. 重构文件读取方法(解决文件读取+空指针问题)

替换loadScanner方法,改用类路径资源读取方式,并通过try-with-resources自动管理资源,同时增加判空逻辑避免空指针:

private ArrayList<String[]> loadScanner(String resourceName) {
    ArrayList<String[]> data = new ArrayList<>();
    
    // 使用try-with-resources自动关闭输入流和Scanner,避免资源泄漏
    try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(resourceName);
         Scanner scanner = new Scanner(inputStream)) {
        
        if (scanner == null) {
            System.out.println("资源加载失败: " + resourceName);
            return data;
        }
        
        scanner.useDelimiter(",");
        while (scanner.hasNext()) {
            String line = scanner.next();
            String[] r = line.trim().split(",");
            data.add(r);
        }
    } catch (IOException e) {
        System.out.println("读取资源出错: " + resourceName);
        e.printStackTrace();
    }
    
    return data;
}

4. 打包验证

  • 若使用Maven/Gradle打包,执行mvn package或gradle build即可,资源文件会自动被包含到Jar包中。
  • 若手动打包,确保将CSV文件放入Jar包的根目录(与main包同级)。

内容的提问来源于stack exchange,提问作者Edwin Ryerson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:30:24