-2

NullPointerExceptionこのコードを実行しようとすると、が表示されます。Nodesに子ノードとして2、3、および4を割り当てましたNode1。Node1のすべての子ノードを調べて、リストを返すメソッドを作成しようとしました。何が間違っているのかわかりません。

public class TestingArrays2 {

    List<Node> myList1;
    List<Node> myList2;
    List<Node> myList3;
    List<Node> myList4;

    private Node Node1;
    private Node Node2;
    private Node Node3;
    private Node Node4;

    public TestingArrays2() {
        myList1 = new ArrayList<Node>();
        myList2 = new ArrayList<Node>();
        myList3 = new ArrayList<Node>();
        myList4 = new ArrayList<Node>();

        myList1.add(Node2);
        myList1.add(Node3);
        myList1.add(Node4);

        Node1 = new Node("One", myList1);
        Node2 = new Node("Two", myList2);
        Node3 = new Node("Three", myList3);
        Node4 = new Node("Four", myList4);

        List<Node> allNodesArray = nodeArray(Node1);

        for (int i = 0; i < allNodesArray.size(); i++){
            System.out.println(allNodesArray.get(i).label);
        }
    }

    public static void main(String arg[]) {
        TestingArrays2 testArray = new TestingArrays2();
    }

    public List<Node> nodeArray(Node n){
        List<Node> tempList = new ArrayList<Node>();

        for (int i = 0; i < n.children.size(); i++){
            tempList.add(n.children.get(i));
        }

    return tempList;
    }
}
4

3 に答える 3

2

あなたはあなたのを作成していませんNodes。これらの行を参照してください...

private Node Node1;
private Node Node2;
private Node Node3;
private Node Node4;

これらは、変数がタイプのオブジェクトを含むことができると宣言するだけNodeです。ただし、最初はnull値で始まります。つまり、空です。

次に、これらの行を呼び出しています...

myList1.add(Node2);
myList1.add(Node3);
myList1.add(Node4);

まだ作成されていないオブジェクトを追加しようとしているため、これはnullに値を挿入します。List

したがって、これらの行が...

Node1 = new Node("One", myList1);
Node2 = new Node("Two", myList2);
Node3 = new Node("Three", myList3);
Node4 = new Node("Four", myList4);

リストに追加しようとする前に表示されますmyList1.add()。これにより、最初にオブジェクトが作成Nodeされ、次にオブジェクトをに追加できますList

@BalusCがコメントで述べたように、オブジェクトforを呼び出そうとしているため、コードの後半でループに失敗しています。上記のように順序を修正すると、これが修正されます。これで、のすべてのオブジェクトがになります。.labelnullListNodes

于 2012-05-27T05:40:29.433 に答える
1

これ:

myList1.add(Node2);
myList1.add(Node3);
myList1.add(Node4);

Node1 = new Node("One", myList1);
Node2 = new Node("Two", myList2);
Node3 = new Node("Three", myList3);
Node4 = new Node("Four", myList4);

ノードが作成される前に、ノードをリストに追加しようとしています。

于 2012-05-27T05:41:48.063 に答える
0

あなたの質問に対する良い答えはすでに与えられています。

あなたのコードを見て、私はいくつかの提案された修正を持っています。

テストクラス(のコンストラクター)ですべての作業を行っています。可能な場合は、これをNodeクラスに委任する方が適切な設計です。また、初期化だけで、コンストラクターで「作業」を行わないようにしてください。

また、クラス名に名詞を使用したり、変数名を小文字で開始したりするなど、適用したコード規則も確認してください。

public class ArrayTest2 {

    public static void main(String arg[]) {

        Node node1 = new Node("One");

        node1.add(new Node("Two"));
        node1.add(new Node("Three"));
        node1.add(new Node("Four"));

        // this calls the toString method of node1
        System.out.println(node1);
    }

}

public class Node {

    private final String name;
    private final List<Node> children;

    public Node(String name) {
        this.name = name;
        this.children = new ArrayList<Node>();
    }

    public String getName() {
        return name;
    }

    public void add(Node children) {
        children.add(child);
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(name);
        if(children.size() > 0) {
            sb.append("(");
            String separator = "";
            for (Node child : children){
                sb.append(separator).append(String.valueOf(child));
                separator = ",";
            }
            sb.append(")");
        }
        return sb.toString();
    }
}

子フィールドはプライベートであり、ゲッターがないことに注意してください。'children'のような内部データ構造への直接アクセスを提供することは悪い習慣と考えられているので、ノードを追加するための'add'メソッドを提供しました。このようにして、クラスはデータに何が起こるかを制御し続けます。これは重要なオブジェクト指向設計の原則です。

toStringメソッドは、ノードの文字列表現を作成します。ノード名を追加し、子がある場合は、各子ノードの文字列表現を括弧で囲まれたコンマ区切りのリストに追加するため、次のように出力されます。

One(Two,Three,Four)

たとえば、より複雑な構造:

Node node1 = new Node("One");
Node node2 = new Node("Two");
Node node3 = new Node("Three");
Node node4 = new Node("Four");
Node node5 = new Node("Five");
Node node6 = new Node("Six");
node1.add(node2);
node1.add(node3);
node2.add(node4);
node4.add(node5);
node4.add(node6);

与える必要があります:

One(Two(Four(Five,Six)),Three)

免責事項:私のコードは手作りで、コンパイルされておらず、テストされていません

于 2012-05-27T09:36:09.643 に答える