为什么这个JAVA代码(DoublyLinkedList)是错误的,堆栈溢出

为什么这个JAVA代码(DoublyLinkedList)是错误的,堆栈溢出,java,doubly-linked-list,Java,Doubly Linked List,我不知道为什么是堆栈溢出 错误消息是这样的 Exception in thread "main" java.lang.StackOverflowError at java.lang.AbstractStringBuilder.append(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at java.lang.StringBuilder.<init>(Unknown Sour

我不知道为什么是堆栈溢出

错误消息是这样的

Exception in thread "main" java.lang.StackOverflowError
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.<init>(Unknown Source)
    at linkedList.Node.toString(DoublyLinkedList.java:15)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
线程“main”java.lang.StackOverflower中出现异常 位于java.lang.AbstractStringBuilder.append(未知源) 位于java.lang.StringBuilder.append(未知源) 位于java.lang.StringBuilder。(未知源) 在linkedList.Node.toString(DoublyLinkedList.java:15) 位于java.lang.String.valueOf(未知源) 位于java.lang.StringBuilder.append(未知源) 然后一遍又一遍地重复同样的信息

这是我第一次得到这个错误,所以请让我知道为什么会发生这个错误

这是用来制作双链表的

当我评论时//tail.next=newOne;或//newOne.prev=尾部

它起作用了

多谢各位

class Node{
    String val;
    Node next;
    Node prev;

    public Node(String val){
        this.val = val;
        this.next = null;
        this.prev = null;
    }

    @Override
    public String toString() {
        return "Node [val=" + val + ", next=" + next + ", prev=" + prev + "]";
    }

}

public class DoublyLinkedList {
    Node head;
    Node tail;
    int length;
    LinkedList<Integer> aa = new LinkedList<>();


    public DoublyLinkedList() {
        this.head = null;
        this.tail = null;
        this.length = 0;
    }

    public static void main(String[] args) {
        DoublyLinkedList dd = new DoublyLinkedList();
        dd.push("asdad");
        dd.push("wwwwwww");
        System.out.println(dd.toString());
    }

    public void push(String val) {
        Node newOne = new Node(val);
        if(length == 0) {
            head = newOne;
            tail = newOne;
        } else {
            tail.next = newOne;
            newOne.prev = tail;
            tail = newOne;
        }

        length++;
    }

    @Override
    public String toString() {
        return "DoublyLinkedList [head=" + head + ", tail=" + tail + ", length=" + length + "]";
    }

}
类节点{
字符串val;
节点下一步;
节点前置;
公共节点(字符串val){
this.val=val;
this.next=null;
this.prev=null;
}
@凌驾
公共字符串toString(){
return“Node[val=“+val+”,next=“+next+”,prev=“+prev+””;
}
}
公共类双链接列表{
节点头;
节尾;
整数长度;
LinkedList aa=新建LinkedList();
公共双链接列表(){
this.head=null;
this.tail=null;
这个长度=0;
}
公共静态void main(字符串[]args){
DoublyLinkedList dd=新的DoublyLinkedList();
dd.push(“asdad”);
dd.push(“WWWWW”);
System.out.println(dd.toString());
}
公共无效推送(字符串val){
Node newOne=新节点(val);
如果(长度==0){
头=新的;
尾巴=新的;
}否则{
tail.next=newOne;
newOne.prev=尾部;
尾巴=新的;
}
长度++;
}
@凌驾
公共字符串toString(){
返回“双链接列表[head=“+head+”,tail=“+tail+”,length=“+length+”];
}
}

我认为您遗漏了一些代码。在您的节点中,有一个节点,在该节点中,有一个节点,在该节点中,有一个节点,…当您在
toString()
返回的字符串中包含
next
时,它实际上意味着
next.toString()
。同样适用于
prev.toString()
。因此,当调用
node.toString()
时,它调用
next.toString()
aka
node.next.toString()
,并调用
prev.toString()
aka
node.next.prev.toString()
,调用
next.toString()
aka
node.next.prev.toString()
,调用
prev.toString())
aka
node.next.prev.next.prev.toString()
,其中…,堆栈溢出!!!--您确实不希望
node.toString()
打印列表中的所有其他节点,因此从
toString()
实现中删除
next
prev
,可能只打印下一个/上一个节点(如果存在)的值,尽管这只对调试有帮助,正常的显示/输出会有点奇怪的信息哦!现在我知道是什么原因导致堆栈溢出了!真的谢谢你们!