【问题标题】:Java, Digester: stuck on this java.lang.NullPointerExceptionJava,Digester:卡在这个 java.lang.NullPointerException
【发布时间】:2011-03-24 14:44:32
【问题描述】:

我正在使用 Commons Digester 解析一个 XML 文件,但我不明白我的代码有什么问题:我被这个 java.lang.NullPointerException 卡住了。

这是代码:http://pastie.org/1708374

这是个例外:http://pastie.org/1708371

我猜这是一个愚蠢的错误

谢谢

【问题讨论】:

    标签: java apache-commons-digester


    【解决方案1】:

    嗯,这就是问题所在:

    if (centroids.length == 0)
    

    据我所知,您永远不会为centroids 赋值,因此它始终为空。然后当你尝试在上面的行中取消引用它时,它会抛出NullPointerException

    下一行代码尝试使用的第一个centroids[0] 表明您并不真正了解Java 数组。也许你真的想要一个 List 的一些描述?

    我也强烈建议不要使用始终具有相同五个键的Map<String, String>,而是创建一个类型(例如Centroid),它具有标题、描述、标签、时间,事件。然后你可以把centroids 变成List<Centroid>:

    List<Centroid> centroids = new ArrayList<Centroid>();
    

    那么当你得到一些数据时......

    Centroid centroid = new Centroid(...);
    centroids.add(centroid);
    

    哦,您目前还在使用== 来比较字符串...不要这样做:使用equals,否则您将比较字符串引用

    【讨论】:

      【解决方案2】:

      作为关于如何读取 NPE 堆栈跟踪的一般说明:

      当你得到一个异常堆栈跟踪时,查看 Caused by 行和它之后的第一行

      Caused by: java.lang.NullPointerException
        at CentroidGenerator.nextItem2(CentroidGenerator.java:31)
      

      当您尝试调用对象上的方法并且该对象为空时,最常发生空指针异常。 上面的错误信息告诉你错误发生在CentroidGenerator.java的第31行:

      if (centroids.length == 0) {
      

      方法调用的格式为 object.method,因此您知道在此实例中为 null 的对象是质心。

      确定什么是 null 的一种快速直观的方法是只查看发生异常的行上的点左侧的内容。在您有多个方法调用的行中,您不会立即知道什么对象是 null,您可能需要进行更多探索,但在本例中并非如此。

      要解决问题,请参阅 Jon 的回答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-08
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多