-2

java.util.LinkedList に問題があります。リストに要素を追加した後でも、リストで poll() を使用すると、null ポインター例外が発生します。スレッドやスレッドに似たものは使用していません。
どんな助けでも大歓迎です。以下は、別のクラスのメイン メソッドから呼び出される myMethod コードです。

  void myMethod(Node start, int startRow){
    LinkedList<Node> queue = new LinkedList<Node>();
    LinkedList<Integer> rowQueue = new LinkedList<Integer>();

    queue.addFirst(start);
    rowQueue.addFirst((Integer)startRow);
    System.out.println( rowQueue.size() );      

    while (queue.size()!=0){            
        Node n = queue.poll();
        int row = rowQueue.poll().intValue(); //This is the line 33 in the error!
            /*Some remaining code which uses variables n and row. The thread of control does not reach here */

    }
  }

以下は出力です。

Exception in thread "main" java.lang.NullPointerException
    at BFS.isConnected(LinkedListTest.java:33)
    at GraphsMain.main(GraphsMain.java:36)
1
ZERO

エラーの後に print ステートメントが実行されるため、私は混乱しています。これはスレッドの問題ですか?LinkedLists が同期されていないことは知っていますが、それが問題なのでしょうか? 単純な実装のためだけに心配する必要がありますか?

4

3 に答える 3

4

キューにいくつかの要素があり、 rowQueueには何もないと仮定します。次に、while ループのロジックは次のように機能します。

  • Node n = queue.poll();キューから最初で唯一の要素を取得し、n 変数に格納します。

  • rowQueueのサイズがゼロかどうかをチェックします。もしそうなら、それはゼロを出力します

  • ただし、問題は hereにあります。もう一度試行しpoll()、今回は null を取得intValue()して戻り値を呼び出し、結果として NullPointerException が発生します。

このような問題は、コード内の次のロジックにあります。

        if(rowQueue.size() == 0){
            System.out.println("ZERO");
        }
        int row = rowQueue.poll().intValue(); 

が 0かどうかを確認rowQueue.size()し、真の場合は、ゼロを出力するだけでなく、実行しないことも確認する必要がありますint row = rowQueue.poll().intValue();。したがって、ループから抜け出すか、それらの線に沿って何かを検討する必要があります。

したがって、次のようなことを試してください。

        if(rowQueue.size() == 0){
            System.out.println("ZERO");
            break; //This ensures that you come out of the loop
        }
        int row = rowQueue.poll().intValue(); 
于 2012-09-15T06:42:43.333 に答える
1

LinkedList<E>.poll()リンクされたリスト内のオブジェクトを返すか、リストが空の場合は null を返します。リストのサイズのチェック内にその呼び出しを配置し​​ないため、リストから整数値を取得しようとすると、リストが空になることがよくあります。

于 2012-09-15T06:39:51.743 に答える
1

欠落しているのはelseステートメントだけです。取得している理由NullPointerExceptionは、ZEROアイテムが含まれているためですrowQueue(33 行目で参照)。

ゼロアウト
(出典: iforce.co.nz )

    int row; //declare and (optional : initialize it to something)
    //only poll the linkedlist if there is something in it...
    if(rowQueue.size() == 0){
        System.out.println("ZERO");
    } else {
     row = rowQueue.poll().intValue();
    }
于 2012-09-15T06:46:24.693 に答える