空指针异常修复 - 列表

时间:2012-10-13 14:14:09

标签: java list nullpointerexception

  public void createGraph () {
    int oldFrom = -1;
    int oldTo = -1;
    for(int i = 0; i < edges.size(); i++) {
      EdgeI e = edges.get(i);
      int from = e.from;
      int to = e.to;
      VertexI v = vertices.get(from);
      if (from == oldFrom && to == oldTo){
        vertexWeight wic = v.neighbors.get(v.neighbors.size() - 1);
        wic.w++;
      }
      else {
        v.neighbors.add(new vertexWeight (to, 1));
        oldFrom = from;
        oldTo = to;
      }
    }
  }

neighbors是来自List课程的公开VertexIw是来自vertexWeight类的公共整数。 edges是位于我的主类中的列表。我一直在为这行代码获取一个空指针异常:

v.neighbors.add(new vertexWeight (to, 1));

尝试使用它大约15分钟,我没有让它工作。我搞砸了什么?

java.lang.NullPointerException
    at tester.createGraph(tester.java:60)
    at tester.main(tester.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

1 个答案:

答案 0 :(得分:2)

简短回答

使用v.neighbors中的new ArrayList()初始化vertices.get()

答案很长

您的问题省略了一个重要信息:您如何初始化neighbors。为什么这很重要?

请参阅:What is a NullPointerException, and how do I fix it?

在您的情况下,我猜测在程序运行期间vneighbors为空。例如,vertices.get(from)可能会返回null,v.neighbors将无效。或neighbors为空,v.neighbors.add()无效。

瞧瞧。您承认在初始化neighbors时将VertexI设置为null。

解决方案是:使用new ArrayList()而不是null进行初始化。

如果那是不可能的,或者由于其他原因你无法避免空指针,你可以像这样做空指针检查:

if (v != null && v.neighbors != null) {
    v.neighbors.add(new vertexWeight (to, 1));
}

这意味着,如果vneighbors为空,请不要添加顶点。

但这很复杂且容易出错。尽可能避免使用空指针更容易。有人会说,不惜一切代价避免它们!改为抛出异常或返回像new ArrayList()这样的“空”对象。