Java Jar运行报错:无法找到指定路径下的CSV文件
问题解决方案
核心问题分析
- 文件找不到:运行Jar包时,
src/main/books.csv是开发阶段的本地文件系统路径,但Jar是压缩包,内部资源无法通过File类直接访问——File只能读取文件系统中的实体文件,而非Jar包内的内嵌资源。 - 空指针异常:文件读取失败后
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
相关产品推荐
相关产品推荐

