JAXB反序列化XML存入Registry数组空指针异常解决咨询
报错原因
你定义的Registry[] xmlentries = null只是声明了数组类型的变量,没有为数组分配实际的内存空间。Java中数组必须先初始化指定长度后,才能通过下标对元素赋值。
修复步骤
- 拿到过滤后的
files数组后,先根据files的长度初始化xmlentries数组 - 优化JAXBContext的创建逻辑:JAXBContext是线程安全的,不需要循环内重复创建,全局初始化一次即可
- 注意:Unmarshaller不是线程安全的,多线程场景下需要在循环内每次创建,单线程场景可复用
修复后代码
JAXBContext jaxbContext = JAXBContext.newInstance(Registry.class); Registry[] xmlentries = null; File dir = new File("XMLFiles"); if (dir.exists() && dir.isDirectory()) { FileFilter filter = new FileFilter() { @Override public boolean accept(File file) { return file.isFile() && file.getName().endsWith(".xml"); } }; File [] files = dir.listFiles(filter); if (files != null) { // 初始化数组,长度和符合条件的XML文件数量一致 xmlentries = new Registry[files.length]; for (int i = 0; i < files.length; i++) { Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); xmlentries[i] = (Registry) jaxbUnmarshaller.unmarshal(files[i]); } } }
可选优化
如果后续需要动态增减元素,也可以先用ArrayList<Registry>存储反序列化结果,最后再转成数组,灵活性更高:
List<Registry> entryList = new ArrayList<>(); // 循环中反序列化后调用 entryList.add(反序列化结果) // 最后转为数组 Registry[] xmlentries = entryList.toArray(new Registry[0]);
内容的提问来源于stack exchange,提问作者Rakshan Premsagar Kapikad
相关产品推荐
相关产品推荐

