有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

调用toString方法第二次尝试时出现java空指针异常

我被指派用addaddAtFirsttoString方法创建一个单独的LinkedList类。除非我再次调用toString方法,否则一切都正常

这是包含方法的完整类:

public class SingleList {

    Node head;
    int size;

public static class Node{

    int data;
    Node next;
    public Node(int data) {
        this.data=data;
        }
    }   

public void add(int data) {
        size++;
    if(head==null) head= new Node(data);

    else {
        Node n= new Node(data);
        Node temp= head;
        while(temp.next!=null) {
            temp= temp.next;
        }
        temp.next=n;
}

    }


public int size() {
    return size;
}

public boolean isEmpty() {
    return head==null;
}

public void insertAtHead(int data) {
    size++;
    Node n= new Node(data);
    n.next=head;
    head=n;
}


@Override
public String toString(){

if(size==0) return"[]";
StringBuilder sb= new StringBuilder().append("[");
for(int i=0;i<size-1;i++)
{   sb.append(head.data+",");
    head=head.next;

}
return sb.append(head.data+"]").toString();
}

}

这是主体内的驾驶员等级代码:

java

        SingleList sl= new SingleList();
        System.out.println(sl);
        for(int i=0;i<=10;i++) sl.add(i);
        System.out.println(sl);
        System.out.println(sl);

输出是这样的

    []
    [0,1,2,3,4,5,6,7,8,9,10]

然后是一个空指针异常,并为异常显示一个sourece行,这是这一行sb.append(head.data+",");


共 (1) 个答案

  1. # 1 楼答案

    您的toString()方法在第一次调用时将成员head设置为null:

    for(int i=0;i<size-1;i++)
    { 
        sb.append( head.data + ",");
        head = head.next;
    }
    

    在第二次调用toString()时,成员head仍然为空。在第一次通过循环时,head.data将导致NullPointerException

    相反,可以使用局部变量

    Node node = head;
    for(int i=0;i<size-1;i++)
    { 
       sb.append(node.data+",");
       node = node.next;
    }
    

    如果你这么做了,你可以迭代节点,而不是它们的索引:

    for ( Node node = head; null != node; node = node.next ) {
       sb.append(node.data+",");
    }