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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:05:17