Ошибка стекового потока во время выполнения

#java

#java

Вопрос:

Когда я запускаю этот код, я получаю StackOverFlowError во время выполнения. Почему я получаю это исключение?

  class F{
    String name;
    int rollNo;
    F ref;

    F(String name,int rollNo){
        this.name = name;
        this.rollNo = rollNo;
        ref = this;
    }

    public static void main(String[] args){
        F f = new F("Shivam",138);
        System.out.println(f);
    }

    public String toString(){
        return name " " rollNo " " ref;
    }
}
  

Это исключение, которое я получаю:

 Exception in thread "main" java.lang.StackOverflowError
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at F.toString(F.java:20)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at F.toString(F.java:20)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at F.toString(F.java:20)
    at java.lang.String.valueOf(String.java:2994)
  

Комментарии:

1. Что вы ожидали, что программа напечатает?

2. Проблема связана с включением «ref» в toString(). Включая туда «ref», он пытается вычислить ref.toString внутри самого метода toString(). Лучше, если вы можете поделиться тем, какой ваш предполагаемый вывод toString.

3. Это просто вопрос бесконечной рекурсии.

4. System.out.println(f); является ли проблема перепроверкой.

5. Нет смысла сохранять ссылку на сам объект в поле. Вы можете ссылаться на сам объект через this из любого места внутри экземпляра.

Ответ №1:

 System.out.println(f); // cause StackOverFlow  Exception
  

когда эта строка выполняет toString() метод, вызываемый f объектом. и
посмотрите на реализацию toString()

 public String toString(){
    return name " " rollNo " " ref;
}
  

В котором вы снова объединяете ref объект таким образом, toString что метод рекурсивно вызывается бесконечно.
измените реализацию toString на это.

 public String toString(){
    return name " " rollNo;
}
  

Ответ №2:

Это потому, что вы самостоятельно ссылаетесь на using ref и печатаете в toString() , что создает бесконечную рекурсию toString() вызова. Не уверен, зачем вам вообще нужна ссылка на себя, вы можете просто использовать this при необходимости. если вам действительно нужно ref , вы можете удалить это из toString() метода, и это должно сработать.

Ответ №3:

Проблема с переопределенным методом toString(), когда вы используете ref, он вызывает свой метод toString(), и снова тот же вызов метода стал рекурсивным, что вызывает проблему. Вы должны использовать поле вашего класса вместо объекта того же класса.