TimeFlow打包Jar后出现文件找不到及空指针异常求助
问题描述
Eclipse中运行TimeFlow项目完全正常,控制台输出:
Running TimeFlow 0.5 No existing settings file found.
但打包成Jar后启动报错,核心错误信息:
Running TimeFlow 0.5 No existing settings file found. java.io.FileNotFoundException: intro.gif (The system cannot find the file specified) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:216) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111) at timeflow.app.AboutWindow.<init>(AboutWindow.java:24) ... java.lang.NullPointerException: Cannot read the array length because "s" is null at timeflow.app.TimeflowApp.getVisibleFiles(TimeflowApp.java:603) at timeflow.app.TimeflowApp.init(TimeflowApp.java:95) ...
已尝试将图片移至项目根目录、复制images文件夹到Jar所在目录、修改构建路径将图片打入Jar(图片直接在Jar根目录而非images文件夹内),均未解决问题。
解决方案
1. 修复intro.gif加载错误(核心问题)
Jar包内的资源不能用FileInputStream读取——因为Jar是压缩包,内部资源并非文件系统中的独立文件,必须通过类加载器读取资源流:
打开AboutWindow.java第24行,替换原有FileInputStream相关代码:
// 路径说明:若图片在Jar根目录用"/intro.gif";若打包后在images目录则用"/images/intro.gif" InputStream inputStream = AboutWindow.class.getResourceAsStream("/intro.gif"); if (inputStream == null) { throw new IOException("无法找到资源文件 intro.gif"); } // 用流加载图片示例 Image introImage = ImageIO.read(inputStream); inputStream.close();
2. 修复空指针异常
TimeflowApp.java第603行的空指针是因为变量s为null,大概率也是资源读取方式错误导致:
- 检查
getVisibleFiles方法中获取文件/资源的代码,避免用File类访问Jar内的目录或文件,改用类加载器的getResource或getResourceAsStream方法。 - 如果是读取Jar外部文件,确保路径是相对于Jar运行目录的绝对路径,可通过
System.getProperty("user.dir")获取当前运行目录来拼接路径。
3. 规范资源打包结构
将images目录恢复为项目源文件夹(Eclipse中右键文件夹 → Build Path → Use as Source Folder),这样打包时会将整个images目录完整打入Jar,资源路径统一为/images/xxx.gif,代码中按此路径加载即可,避免资源散落在Jar根目录,便于维护。
内容的提问来源于stack exchange,提问作者freedom freedom
相关产品推荐
相关产品推荐

