Eclipse导出Jar包后JSONTokener运行崩溃问题咨询
Jar包运行时读取外部JSON文件卡住的解决办法
你的问题根源在于ClassLoader.getSystemResourceAsStream()的使用场景错误:
- 这个方法是从JVM的类路径(包括Jar包内部、项目编译后的class目录)加载资源的,当你把
Calendar.json放在Jar外部时,它根本找不到文件,返回了null。 - JSONTokener接收
null的InputStream后,会进入无限等待输入的阻塞状态,导致程序卡住。
而Eclipse中能正常运行,是因为项目根目录属于类路径的一部分,Calendar.json放在这里时,类加载器能直接找到。
解决方法:
直接通过文件系统路径读取外部JSON文件,而不是依赖类加载器:
方法1:读取Jar同目录下的JSON文件
如果Calendar.json和Jar包放在同一个文件夹里,用以下代码:
try { // 直接指定文件名,程序会从当前工作目录(Jar所在目录)查找 File jsonFile = new File("Calendar.json"); InputStream is = new FileInputStream(jsonFile); JSONTokener tokener = new JSONTokener(is); JSONObject jsonObject = new JSONObject(tokener); // 后续的写入或其他操作 } catch (FileNotFoundException e) { System.err.println("找不到Calendar.json文件,请确认文件和Jar包在同一目录"); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }
方法2:通过命令行参数指定文件路径
如果JSON文件不在Jar同目录,可在运行Jar时传入文件路径:
java -jar YourProject.jar /path/to/Calendar.json
然后代码中读取参数:
public static void main(String[] args) { if (args.length == 0) { System.err.println("请传入JSON文件路径"); return; } try { File jsonFile = new File(args[0]); InputStream is = new FileInputStream(jsonFile); JSONTokener tokener = new JSONTokener(is); JSONObject jsonObject = new JSONObject(tokener); // 后续操作 } catch (FileNotFoundException e) { System.err.println("指定路径下找不到JSON文件"); e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
关键注意点:
- 不要用类加载器读取外部文件,类加载器只负责加载类路径内的资源(Jar内部、编译后的class文件目录)。
- 必须添加异常捕获,避免文件不存在、格式错误等问题导致程序崩溃或无响应。
内容的提问来源于stack exchange,提问作者BoomFlame
相关产品推荐
相关产品推荐

