之前在练习中碰到一个问题,程序中没有使用递归却出现了 Exception in thread “main” java.lang.StackOverflowError 异常,先把之前的代码贴上来:
public class InfiniteRecursion {
public String toString() {
return "InfiniteRecursion address" + this + "\n";
}
public static void main(String[] args) {
InfiniteRecursion infiniteRecursion = new InfiniteRecursion();
System.out.println(infiniteRecursion.toString());
}
}
程序希望打印出 InfiniteRecursion address+“类内存地址”的格式,结果却出现了异常,分析一下为什么会出现这种情况:
首先,toString中this要跟前面的字符串连接,会进行自动类型转换,也就是要调用该类的toString方法,而该类重写了父类Object的toString
方法,所以就会直接调用该类的toString方法,结果每一次调用toString都会引发继续调用toString方法的逻辑,即无意识递归,导致出现 StackOverflowError 异常,所以如果想在toString 中打印类内存地址,可以通过super关键字直接调用父类的方法,即Object.toString(),修改后的代码如下:
public class InfiniteRecursion {
public String toString() {
return "InfiniteRecursion address" + super.toString() + "\n";
}
public static void main(String[] args) {
InfiniteRecursion infiniteRecursion = new InfiniteRecursion();
System.out.println(infiniteRecursion.toString());
}
}