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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:42:00