// strings/InfiniteRecursion.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
// Accidental recursion
// {ThrowsException}
// {VisuallyInspectOutput} Throws very long exception
import java.util.*;
import java.util.stream.*;
public class InfiniteRecursion {
@Override
public String toString() {
return " InfiniteRecursion address: " + this + "\n";// Throws very long exception
}
public static void main(String[] args) {
Stream.generate(InfiniteRecursion::new).limit(10).forEach(System.out::println);
}
}
the exception example is
…………………………………………
at java.lang.StringBuilder.append(StringBuilder.java:131)
at InfiniteRecursion.toString(InfiniteRecursion.java:15)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at InfiniteRecursion.toString(InfiniteRecursion.java:15)
at java.lang.String.valueOf(String.java:2994)
at java.lang.StringBuilder.append(StringBuilder.java:131)
at InfiniteRecursion.toString(InfiniteRecursion.java:15)
The solution is using super.toString() instead of this.
then it outputs
InfiniteRecursion address: InfiniteRecursion@1b28cdfa
InfiniteRecursion address: InfiniteRecursion@eed1f14
InfiniteRecursion address: InfiniteRecursion@7229724f
InfiniteRecursion address: InfiniteRecursion@4c873330
InfiniteRecursion address: InfiniteRecursion@119d7047
InfiniteRecursion address: InfiniteRecursion@776ec8df
InfiniteRecursion address: InfiniteRecursion@4eec7777
InfiniteRecursion address: InfiniteRecursion@3b07d329
InfiniteRecursion address: InfiniteRecursion@41629346
InfiniteRecursion address: InfiniteRecursion@404b9385
references:
1. On Java 8 - Bruce Eckel
2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/strings/InfiniteRecursion.java