我正在使用Commons Digester解析XML文件,我不明白我的代码中有什么问题:我遇到了这个java.lang.NullPointerException。
这是代码:http://pastie.org/1708374
这是个例外:http://pastie.org/1708371
我猜这是一个愚蠢的错误
感谢
答案 0 :(得分:2)
嗯,这就是问题:
if (centroids.length == 0)
就我所见,您永远不会为centroids
分配值,因此它始终为null。然后,当您尝试在上面的行中取消引用它时,它将抛出NullPointerException
。
下一行代码尝试使用centroids[0]
的第一行表明您并不真正理解Java数组。也许你真的想要一些List
的描述?
我也强烈建议您不要使用始终具有相同五个键的Map<String, String>
,而是创建一个具有属性title的类型(例如Centroid
),描述,标签,时间和事件。然后,您可以centroids
List<Centroid>
:
List<Centroid> centroids = new ArrayList<Centroid>();
然后当你得到一些数据......
Centroid centroid = new Centroid(...);
centroids.add(centroid);
哦,你现在也在使用==
来比较字符串...不要这样做:使用equals
,否则你将比较字符串引用
答案 1 :(得分:1)
作为关于如何读取NPE堆栈跟踪的一般说明:
当您获得异常堆栈跟踪时,请查看“由行引起的”及其后的第一行
Caused by: java.lang.NullPointerException
at CentroidGenerator.nextItem2(CentroidGenerator.java:31)
当您尝试在对象上调用方法并且该对象为null时,通常会发生空指针异常。 上面的错误消息告诉您错误发生在CentroidGenerator.java的第31行:
if (centroids.length == 0) {
方法调用的格式为object.method,所以你知道在这个例子中,null的对象是质心。
确定空值的快速直观方法是仅查看发生异常的行左侧点的内容。在您有多个方法调用的行中,您不会立即知道哪个对象为null,您可能需要更多探索,但不是在此实例中。
要解决问题,请参阅Jon的回答。