“最常见的原因”;java.lang.NullPointerException“;在处理XMLs时?

“最常见的原因”;java.lang.NullPointerException“;在处理XMLs时?,java,xml,dom,parsing,dtd,Java,Xml,Dom,Parsing,Dtd,我最大的优势是,处理传入XML的代码实际上接收到一个无效/不完整的文件,因此DOM解析失败。有什么建议吗?不完整的文件肯定是开始查找的地方。我会在你解析文件之前把它打印出来,看看有什么东西被发送到解析器。如果它是不完整的,它将是显而易见的。如果无效,您需要进行一些搜索。您应该有一个堆栈跟踪,指向您的NPE被抛出的位置。这将缩小可以为null的变量的数量。我建议添加适当的检查,并在可以检测到错误时立即抛出异常,而不是获取调试器或printf。避免以后出现神秘问题是一个好习惯。理想情况下,您应该在调

我最大的优势是,处理传入XML的代码实际上接收到一个无效/不完整的文件,因此DOM解析失败。有什么建议吗?

不完整的文件肯定是开始查找的地方。我会在你解析文件之前把它打印出来,看看有什么东西被发送到解析器。如果它是不完整的,它将是显而易见的。如果无效,您需要进行一些搜索。

您应该有一个堆栈跟踪,指向您的NPE被抛出的位置。这将缩小可以为null的变量的数量。我建议添加适当的检查,并在可以检测到错误时立即抛出异常,而不是获取调试器或printf。避免以后出现神秘问题是一个好习惯。

理想情况下,您应该在调试器中运行java应用程序,因此当抛出未捕获的异常时,您可以检查调用堆栈、变量等,并准确查看导致崩溃的行,以及可能使用的数据为null


如果出于任何原因无法使用调试器,则使用调试支持编译应用程序,并为此特定错误添加异常处理程序,然后打印堆栈跟踪。同样,这将准确显示导致崩溃的文件中的哪一行。

我的第一个猜测是,使用代码的DOM将DTD中标记为可选的元素视为强制元素

编辑以添加: 我的意思是,除非针对DTD进行验证,否则不能期望像下面这样的东西(使用dom4j的示例)返回除null以外的任何内容

doc.selectSingleNode("//some/element/in/a/structure");

如果您将元素导航调用串接在一起,或者通常在使用返回值之前不检查返回值,则情况当然也是如此。

谢谢您的评论!不幸的是,这些都是Java EAI应用程序的专有方法,因此我无法修改源代码。感谢您的评论!介意详细说明一下吗?不幸的是,我两者都做不到,它是一个专有的应用程序,因此我无法访问代码,加上它是非常遗留的,所以它几乎不受支持。