Java使用SAX解析XML时报root为null空指针异常解决咨询
问题根因
- 最核心的问题是你自定义的
SAXParser类的parser()方法,在XML解析流程完全正常执行完成后,最后一行硬编码返回了null,没有把解析得到的Root对象返回,自然main方法里拿到的root就是空值,调用toString()就触发了空指针异常。 - 哪怕解析过程没有抛出任何异常,按现有代码也永远拿不到解析结果:你自定义的
SAXParserHandler负责封装解析后生成Root对象的逻辑,解析完成后需要从handler实例中把生成的Root对象取出来返回才有效。 - 额外可能触发空指针的场景:如果
data.xml文件不在项目工作目录下、文件格式不合法,也会触发IO或解析异常返回null,同样会导致后续空指针。
修复方案
1. 修正SAXParser类的parser()方法
把最后一行的return null替换为从handler中取解析完成的Root对象返回,修改后代码如下:
public Root parser(){ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParserHandler handler = new SAXParserHandler(); javax.xml.parsers.SAXParser parser; try{ parser = factory.newSAXParser(); }catch(Exception e){ System.out.println("Open sax parser error " + e.toString()); return null; } File file = new File("data.xml"); try { parser.parse(file, handler); } catch (SAXException e) { System.out.println("Sax parsing error " + e.toString()); return null; } catch (IOException e) { System.out.println("IO parsing error " + e.toString()); return null; } // 从handler中取出解析构建好的Root对象返回 return handler.getRoot(); }
2. 优化main方法增加空判断
避免解析失败时再次触发空指针:
public static void main(String[] args) { SAXParser parse = new SAXParser(); Root root = parse.parser(); if (root != null) { System.out.println("Root " + root.toString()); } else { System.out.println("XML解析失败,未获取到Root对象"); } }
注意事项
- 确认你的
SAXParserHandler类已经正确实现了SAX的解析回调方法,内部完成了Root对象的组装逻辑,且提供了public Root getRoot()的公共方法返回组装好的Root实例 - 确认
data.xml文件放在项目的运行工作目录下,避免文件不存在触发IO异常
内容的提问来源于stack exchange,提问作者Bale
相关产品推荐
相关产品推荐

