1

宿題として、Chairオブジェクトを取り込み、作成した に追加する必要がありDoublyLinkedListます。アルファベット順にソートする必要があります。スタイルがアルファベット順に同じ場合は、色でソートします

ループを通過しようとすると、NullPointerException.

public void add(Chair element){
    if(isEmpty() || first.object.style.compareTo(element.style) > 0 || (first.object.style.compareTo(element.style) == 0 && first.object.color.compareTo(element.color) >= 0){
        addFirst(element);
    }else if(first.object.style.compareTo(element.style) <= 0){
        Node temp = first;
        Node insert = new Node(); insert.object = element;
        while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs
            if(temp.hasNext())
                temp = temp.next;
        while(temp.object.style.compareTo(element.style) == 0 && temp.object.color.compareTo(element.color) <= 0)
            if(temp.hasNext())
                temp = temp.next;
        insert.prev = temp.prev;
        insert.next = temp;
        temp.prev.next = insert;
        temp.prev = insert;
    }
}

これは、情報を DoublyLinkedList に入れるコードです

try{
        FileReader fr = new FileReader(filename);
        Scanner sc = new Scanner(fr);
        String[] temp;

        while(sc.hasNext()){
            temp = sc.nextLine().split(" ");
            if(temp[0].equals("Bed")){}
            else if(temp[0].equals("Table")){
            //  tables.add(new Table(Integer.parseInt(temp[1]), Integer.parseInt(temp[2]), Integer.parseInt(temp[3]), temp[4]));
            }else if(temp[0].equals("Desk")){}
            else if(temp[0].equals("Chair")){
                chairs.add(new Chair(temp[1], temp[2]));
            }else if(temp[0].equals("Bookshelves")){}
            else{
                color = temp[0];
            }
        }
        while(!chairs.isEmpty())
            System.out.println(chairs.removeFirst().info());
        System.out.println();
        //while(!tables.isEmpty())
        //  System.out.println(tables.removeFirst().info());
    }catch(Exception e){e.printStackTrace();}

これは私が作成した DoublyLinkedList クラスです。

public CDoublyLinkedList(){
    first = new Node(); last = new Node();
    first.prev = last.next = null;
    first.object = last.object = null;
    first.next = last;
    last.prev = first;
}

public boolean isEmpty(){
    return first.object == null;
}

public void addFirst(Chair element){
    Node insert = new Node();
    insert.object = element;
    insert.prev = null;
    insert.next = first;
    first.prev = insert;
    first = insert;
}

public void add(Chair element){
    if(isEmpty() || first.object.style.compareTo(element.style) > 0 || (first.object.style.compareTo(element.style) == 0 && first.object.color.compareTo(element.color) >= 0){
        addFirst(element);
    }else if(first.object.style.compareTo(element.style) <= 0){
        Node temp = first;
        Node insert = new Node(); insert.object = element;
        while(first.object.style.compareTo(element.style) <= 0)
            if(temp.hasNext())
                temp = temp.next;
        while(first.object.style.compareTo(element.style) == 0 && first.object.color.compareTo(element.color) <= 0)
            if(temp.hasNext())
                temp = temp.next;
        insert.prev = temp.prev;
        insert.next = temp;
        temp.prev.next = insert;
        temp.prev = insert;
    }
}

public Chair removeFirst(){
    Chair tobedeleted = first.object;
    Node temp = first.next;
    first = temp;
    first.prev = null;
    return tobedeleted;
}

private class Node{
    Node next, prev;
    Chair object;
    public boolean hasNext(){
        return next != null;
    }
}

}

椅子クラス:

class Chair extends Furniture{
public String style, color;
public Chair(String s, String c){
    style = s; color = c;
}
public String toString(){
    return color;
}
public String getType(){
    return "Chair";
}
public String info(){
    return (color+", "+style);
}
 }

このエラーが発生し続ける理由を誰かに説明してもらえますか? ありがとうございました!

編集:

while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs

chairs.add(new Chair(temp[1], temp[2]));

java.lang.NullPointerException
at CDoublyLinkedList.add(Furnish2SS.java:119)
at Furnish2SS.main(Furnish2SS.java:23)
java.lang.NullPointerException
at CDoublyLinkedList.add(Furnish2SS.java:119)
at Furnish2SS.main(Furnish2SS.java:23)

EDIT2:解決しました!

while ループを次のように変更しました。

while(temp.object != null && element != null && (temp.object.compareTo(element) == 0 || temp.object.compareTo(element) == -1))

エラーが発生した理由は、nullすべての反復をチェックしていなかったためです。

4

2 に答える 2

2

あなたは、これが例外を引き起こしているコード行だと言います:

while(temp.object.style.compareTo(element.style) <= 0)

おそらく、その行にデバッガー ブレークポイントを設定し、デバッガーを使用してどの値が null であるかを判断する必要があります。しかし、ここでデバッガーのセットアップ方法と使用方法の完全な手順を説明するのは難しいです (それは、学ぶべきではないという意味ではありません! 学ぶべきです。チュートリアルはたくさんあります。Google で検索してください)。どの変数が null かを示すコードを投稿します。

if (temp == null) {
    System.out.println("temp is null");
} else if (temp.object == null) {
    System.out.println("temp.object is null");
} else if (temp.object.style == null) {
    System.out.println("temp.object.style is null");
} 

if (element == null) {
    System.out.println("element is null");
} else if (element.style == null) {
    System.out.println("element.style is null");
}


while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs
{
    if(temp.hasNext())
        temp = temp.next;

    if (temp == null) {
        System.out.println("loop: temp is null");
    } else if (temp.object == null) {
        System.out.println("loop: temp.object is null");
    } else if (temp.object.style == null) {
        System.out.println("loop: temp.object.style is null");
    } 

    if (element == null) {
        System.out.println("loop: element is null");
    } else if (element.style == null) {
        System.out.println("loop: element.style is null");
    }

}

上記のコード ステートメントを使用して、コードのこれら 3 行を置き換えると、次のようになります。

    while(temp.object.style.compareTo(element.style) <= 0) //This is where the nullPointerException occurs
        if(temp.hasNext())
            temp = temp.next;

出力されるステートメントに基づいて、どの変数が null であるかがわかります。うまくいけば、そこからそれを取ることができます。(NullPointerException を修正する通常の方法は、プログラムが NullPointerException の行に到達するまでに、問題のある null 変数が実際に有効な非 null 値を持つようにするために必要な手順を実行することです)。

于 2012-04-11T20:28:30.800 に答える
2

をご覧くださいaddFirst(Chair element)。その方法は本当にめちゃくちゃです。Node正しい を含む新しい を作成しますChair。次に、それを に設定prevnullます。次に、 に設定nextfirstます。そして、これがあなたのすべての問題の原因です。first空の を指しているためNodeです。あなたはこれで終わります:

firstあなたの新しいを指しますNodeNodeそれは no を保持する a を指しChairます。それは再び を指していlastます。

e:

あなたのコード全体は、リストを実装するために少なくとも 2 つの異なるアプローチがあり、それらを一緒に投げたように見えます。他にもエラーがいくつかありますが、これは宿題なので、最初に修正してみるとそれほど悪くはないと思います。

それを修正する方法がわからない場合は、ここで質問してください。

PS: 私の回答をすべて編集し、(元に) 削除して申し訳ありません (お気づきの場合)。私は少し疲れていて、古いエラーを修正することで新しいエラーを引き起こし続け、最終的にこれらすべての真の原因が何であるかを突き止めました。

于 2012-04-11T22:13:22.730 に答える