【问题标题】:Unexpected behavior of the toString method in JavaJava 中 toString 方法的意外行为
【发布时间】:2023-02-26 19:26:16
【问题描述】:

我正在尝试在我的 DoublyLinkedList 类中实现 append 方法,但我遇到了一些与 toString 方法相关的错误

public class DoublyLinkedList {
    private Node head;
    private Node tail;
    private int length;
    static class Node {
        int value;
        Node prev;
        Node next;

        public Node(int value) {
            this.value = value;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "value=" + value +
                    ", prev=" + prev +
                    ", next=" + next +
                    '}';
        }
    }

    public DoublyLinkedList(int value) {
        this.head = new Node(value);
        this.tail = this.head;
        this.length = 1;
    }

    public void append(int value) {
        Node newNode = new Node(value);
        if (this.length == 0) {
            this.head = newNode;
            this.tail = newNode;
            return;
        }
        this.tail.next = newNode;
        newNode.prev = this.tail;
        this.tail = newNode;
        this.length++;
    }

    @Override
    public String toString() {
        return "DoublyLinkedList{\n" +
                "\thead=" + head +
                ",\n\ttail=" + tail +
                ",\n\tlength=" + length +
                "\n}";
    }
}
public class Main {
    public static void main(String[] args) {
        DoublyLinkedList doublyLinkedList = new DoublyLinkedList(1);
        doublyLinkedList.append(2);
        System.out.println(doublyLinkedList);
    }
}

我的标准输出中收到大量此类错误消息

tech.othmane.doublylinkedlist.Main
Exception in thread "main" java.lang.StackOverflowError
    at tech.othmane.doublylinkedlist.DoublyLinkedList$Node.toString(DoublyLinkedList.java:18)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)
    at tech.othmane.doublylinkedlist.DoublyLinkedList$Node.toString(DoublyLinkedList.java:18)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)
    at tech.othmane.doublylinkedlist.DoublyLinkedList$Node.toString(DoublyLinkedList.java:18)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)
    at tech.othmane.doublylinkedlist.DoublyLinkedList$Node.toString(DoublyLinkedList.java:18)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)
    at tech.othmane.doublylinkedlist.DoublyLinkedList$Node.toString(DoublyLinkedList.java:18)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)
    at tech.othmane.doublylinkedlist.DoublyLinkedList$Node.toString(DoublyLinkedList.java:18)
    at java.base/java.lang.StringConcatHelper.stringOf(StringConcatHelper.java:453)

该问题与 Node 类中的 toString 方法有关。

@Override
        public String toString() {
            return "Node{" +
                    "value=" + value +
                    ", prev=" + prev +
                    ", next=" + next +
                    '}';
        }

当我注释掉 prev 或 next 字段时,代码有效

【问题讨论】:

  • edit您的问题以包含完整的堆栈跟踪。
  • 您有两个版本的 toString 方法,它们甚至无法编译。那么是哪一个呢?此外,您的错误不是完整的堆栈跟踪,您错过了错误消息。请更新您的问题。
  • 我已经更新了我的问题。这就是我得到的
  • Node 不应该是 static
  • 它也不应该嵌套在你的其他类中。

标签: java


【解决方案1】:

你收到一个StackOverflowError。这是因为在 Node 类 toString() 中,您在两者上都调用了 Node#toString上一页下一个.这将导致无限递归 toString 调用。

假设您有一个包含两个节点的列表,例如 1 -> 2

  • 节点1 将呼叫下一个2
  • 节点2 将调用上一页1
  • 节点1 将调用下一个2
  • 等等(无限循环)

Node 类 toString 应该只返回节点的值。

@Override
public String toString() {
     return "Node{value = " + value + "}";
}

您可以注意迭代 DoublyLinkedList 类中的节点以构建显示所有元素的 toString。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2016-08-21
    • 1970-01-01
    • 2019-07-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多