这在Java中-线程中的异常;“主要”;栈溢出

这在Java中-线程中的异常;“主要”;栈溢出,java,stack-overflow,Java,Stack Overflow,为什么会出现堆栈溢出错误 我的班级- public class Tester { int id; Tester(int id){ this.id = id; } public String toString(){ String rep = "Hex: " + this + ", Id: " + this.id; return rep; } } class Driver{ public static void main(String [] args){

为什么会出现堆栈溢出错误

我的班级-

public class Tester {

int id;

 Tester(int id){
  this.id = id;
 }

 public String toString(){

  String rep = "Hex: " + this + ", Id: " + this.id;
  return rep;
 }

}
class Driver{

    public static void main(String [] args){

        Tester t = new Tester(123);
        System.out.println(t);

    }

}
Exception in thread "main" java.lang.StackOverflowError
    at java.lang.String.length(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.<init>(Unknown Source)
    at com.examscam.model.Tester.toString(Tester.java:13)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)

---------REPEAT !!!
主要方法-

public class Tester {

int id;

 Tester(int id){
  this.id = id;
 }

 public String toString(){

  String rep = "Hex: " + this + ", Id: " + this.id;
  return rep;
 }

}
class Driver{

    public static void main(String [] args){

        Tester t = new Tester(123);
        System.out.println(t);

    }

}
Exception in thread "main" java.lang.StackOverflowError
    at java.lang.String.length(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.<init>(Unknown Source)
    at com.examscam.model.Tester.toString(Tester.java:13)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)

---------REPEAT !!!
错误-

public class Tester {

int id;

 Tester(int id){
  this.id = id;
 }

 public String toString(){

  String rep = "Hex: " + this + ", Id: " + this.id;
  return rep;
 }

}
class Driver{

    public static void main(String [] args){

        Tester t = new Tester(123);
        System.out.println(t);

    }

}
Exception in thread "main" java.lang.StackOverflowError
    at java.lang.String.length(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.<init>(Unknown Source)
    at com.examscam.model.Tester.toString(Tester.java:13)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)

---------REPEAT !!!
线程“main”java.lang.StackOverflower中出现异常 at java.lang.String.length(未知源) 位于java.lang.AbstractStringBuilder.append(未知源) 位于java.lang.StringBuilder.append(未知源) 位于java.lang.StringBuilder。(未知源) 位于com.examcam.model.Tester.toString(Tester.java:13) 位于java.lang.String.valueOf(未知源) 位于java.lang.StringBuilder.append(未知源) ---------重复一遍!!!
您正在使用
这个
关键字

String rep = "Hex: " + this + ", Id: " + this.id;
这表示当前对象。您当前的对象被一次又一次地递归调用,因此

java.lang.StackOverflower错误

您正在添加“this”。这将调用toString()方法,该方法再次调用toString()。。。
它是一个无限递归循环,没有结束。

因为您在toString()中引用了
这个

这意味着调用了
this.toString()
,因此发生了无限递归

,因为

"Hex: " + this
相当于

"Hex: " + this.toString()
 this.toString()

你是从
toString()
,所以
toString()
调用自己,它调用自己,它调用自己…

你的toString方法就是罪魁祸首

String rep = "Hex: " + super.toString() /* Not this */
   + ", Id: " + this.id;
这条线

String rep = "Hex: " + this + ", Id: " + this.id;
将成为

String rep = "Hex: " + this.toString() + ", Id: " + this.id;

在运行时,将再次调用类的toString..wi..

String rep=“Hex:+this+”,Id:+this.Id

  this
相当于

"Hex: " + this.toString()
 this.toString()

并从toString()调用它,将再次调用toString,然后再次…

我认为您正在重写toString方法,并且在重写的方法体中,您将再次调用您的方法!通过在toString方法中写入此+“”来调用toString

String rep = "Hex: " + this + ", Id: " + this.id;
等于
String rep=“Hex:+this.toString()+”,Id:+this.Id内部

这将导致递归方法调用,从而导致

 java.lang.StackOverflowError
你写道:

String rep = "Hex: " + this + ", Id: " + this.id;
在java中,简单地编写
this
意味着间接调用
this.toString()

我相信您正在试图覆盖
对象的
toString()
方法,并且在您的
toString()
版本中,您希望打印您传递的id以及对象的
hashcode

因此,要获得输出替换

String rep = "Hex: " + this + ", Id: " + this.id;

您将得到如下输出:

Hex: 1800024669, Id: 123

因为在toString方法中首先使用这个函数会递归调用toString方法,从而导致堆栈溢出。

您打算在toString中做什么method@VineetSingla-显示此
的值。但是很明显,我不能不引起这样的错误。打印这个只会打印classname@hashcode值,Tester类只有一个属性id,所以只需打印id就可以了。是的,oracle文档toString()具有相同的定义。我非常喜欢你的回答!击掌!您也可以使用
super.toString()
调用super类方法。