#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(), и снова тот же вызов метода стал рекурсивным, что вызывает проблему. Вы должны использовать поле вашего класса вместо объекта того же класса.