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

neighborsクラスListからのパブリックです。クラスからのパブリック整数です。私のメインクラスにあるリストです。このコード行でnullポインタ例外が発生し続けます:VertexIwvertexWeightedges

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.neighborsします。new ArrayList()vertices.get()

長い答え

あなたの質問は重要な情報を省略しました:どのように初期化したかneighbors。何でこれが大切ですか?

参照:NullPointerExceptionとは何ですか、またそれを修正するにはどうすればよいですか?

vあなたの場合、プログラムの実行中にまたはneighborsがnullであると推測しました。たとえば、vertices.get(from)nullを返す可能性があり、機能しv.neighborsません。またはneighborsnullであり、機能しv.neighbors.add()ません。

そして、voilà。neighborsを初期化するときにnullに設定したことを認めましたVertexI

new ArrayList()解決策は次のとおりです。の代わりにで初期化しますnull

それが不可能だった場合、または他の理由でnullポインターを回避できない場合は、次のようにnullポインターチェックを実行できます。

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

vつまり、またはneighborsがnullの場合は、頂点を追加しないでください。

しかし、これは複雑でエラーが発生しやすいものです。nullポインタをできるだけ避ける方が簡単です。一部の人は、絶対にそれらを避けてくださいと言うでしょう!代わりに例外をスローするか、のような「空の」オブジェクトを返しますnew ArrayList()

于 2012-10-13T14:29:55.103 に答える