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

如何读取初始为空的JSON文件?解析空文件时出现空指针异常

读取空JSON文件的空指针异常修复方案

问题场景

需要读取一个程序启动时为空、后续可写入的JSON文件,当前编写的readFile方法尝试通过ave.length==0判断空文件,运行时抛出空指针异常:

Exception in thread "main" java.lang.NullPointerException: Cannot read the array length because "ave" is null
    at Persistence.AventuraDAO.readFile(AventuraDAO.java:25)
    at Business.AventuraManage.lookMonstersCombatActual(AventuraManage.java:48)
    at Presentation.Controller.createAdvenutre(Controller.java:198)
    at Presentation.Controller.executeOption(Controller.java:47)
    at Presentation.Controller.run(Controller.java:30)
    at Main.main(Main.java:21)

原代码如下:

public ArrayList<Aventura> readFile(){
    ArrayList<Aventura> aventures = new ArrayList<>();
    try{
        AventuraDAO aventuraDAO=new AventuraDAO();
        AventuraManage aventuraManage=new AventuraManage(aventuraDAO);
        Gson g=new Gson();
        JsonReader reader=new JsonReader(new FileReader("Files/adventures.json"));
        Aventura[] ave=g.fromJson(reader, Aventura[].class );

        if (ave.length==0){
            System.out.println("The file should be empty");
            ArrayList<Aventura> aventures2 =null;
            return aventures2;
        }
        
        for (int i = 0; i < ave.length; i++) {
            aventures.add(ave[i]);
        }
    }
    catch(FileNotFoundException e){
        System.out.println("The file does not exists");
    }
    catch (IOException e){
        ArrayList<Aventura> aventures2 =null;

        System.out.println(e.getMessage());
        e.printStackTrace();

    }
    return aventures;
}

错误原因

当JSON文件内容为空时,Gson的fromJson方法解析数组类型会返回null,而非长度为0的数组。此时直接访问ave.length就会触发空指针异常。

修复后的代码

public ArrayList<Aventura> readFile() {
    ArrayList<Aventura> aventures = new ArrayList<>();
    try {
        Gson g = new Gson();
        // 使用try-with-resources自动关闭IO资源,避免泄漏
        try (JsonReader reader = new JsonReader(new FileReader("Files/adventures.json"))) {
            Aventura[] ave = g.fromJson(reader, Aventura[].class);

            // 优先判断数组是否为null,对应空文件场景
            if (ave == null) {
                System.out.println("The file is empty");
                return null;
            }
            // 再判断是否为空数组
            else if (ave.length == 0) {
                System.out.println("The file contains an empty array");
                return null;
            }

            // 用Collections.addAll简化数组转集合的操作
            Collections.addAll(aventures, ave);
        }
    } catch (FileNotFoundException e) {
        System.out.println("The file does not exist");
        return null;
    } catch (IOException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
        return null;
    }
    return aventures;
}

关键修复点

  • 先判断ave == null,处理空文件场景,直接返回null满足后续校验需求
  • 用try-with-resources自动管理JsonReader资源,避免手动关闭遗漏
  • 移除原代码中未使用的AventuraDAO和AventuraManage实例创建,精简代码
  • 统一异常分支的返回逻辑,确保文件不存在或IO异常时也返回null
  • 用Collections.addAll替代手动循环添加,简化数组转集合的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:15:27