Исключение нулевого указателя при второй попытке вызова метода toString - PullRequest
0 голосов
/ 10 октября 2019

Мне дано задание создать класс LinkedList по одному методу add, addAtFirst и toString. Все работает нормально, если я не сделаю второй вызов 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]

А затем исключение нулевого указателя и показывает строку источника для исключения, которая является этой строкой sb.append(head.data+",");

1 Ответ

2 голосов
/ 10 октября 2019

Ваш метод toString() устанавливает для члена head значение NULL при первом вызове:

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

При втором вызове toString() элемент head по-прежнему равен NULL. При первом прохождении цикла 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+",");
}
...