0
  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;
      }
    }
  }

neighborsList来自VertexI班级的公众。wvertexWeight类的公共整数。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)
4

1 回答 1

2

简短的回答

v.neighborsnew ArrayList()in初始化vertices.get()

长答案

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

请参阅:什么是 NullPointerException,我该如何解决?

在你的情况下,我猜想在程序运行期间要么v或为空。neighbors例如vertices.get(from)可以返回 null 并且v.neighbors不起作用。或neighbors为空,并且v.neighbors.add()不起作用。

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

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

如果这是不可能的,或者由于某些其他原因您无法避免空指针,您可以像这样进行空指针检查:

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

v这意味着,如果或neighbors为空,则不要添加顶点。

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

于 2012-10-13T14:29:55.103 回答