【发布时间】:2011-03-24 14:44:32
【问题描述】:
我正在使用 Commons Digester 解析一个 XML 文件,但我不明白我的代码有什么问题:我被这个 java.lang.NullPointerException 卡住了。
这是代码:http://pastie.org/1708374
这是个例外:http://pastie.org/1708371
我猜这是一个愚蠢的错误
谢谢
【问题讨论】:
标签: java apache-commons-digester
我正在使用 Commons Digester 解析一个 XML 文件,但我不明白我的代码有什么问题:我被这个 java.lang.NullPointerException 卡住了。
这是代码:http://pastie.org/1708374
这是个例外:http://pastie.org/1708371
我猜这是一个愚蠢的错误
谢谢
【问题讨论】:
标签: java apache-commons-digester
嗯,这就是问题所在:
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,否则您将比较字符串引用。
【讨论】:
作为关于如何读取 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 的回答。
【讨论】: