如何读取初始为空的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
相关产品推荐
相关产品推荐

