这在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类方法。