1 回答
TA贡献1807条经验 获得超9个赞
这两行看起来很可疑:
OutputStream tmp=System.out;
//...
System.setOut(new PrintStream(tmp));
System.out已经是一个PrintStream,所以恕我直言,这些行应该读
PrintStream tmp=System.out;
//...
System.setOut(tmp);
否则会发生什么情况是您PrintStream在PrintStreams 中几乎无限地包裹了s。PrintStreams 的嵌套仅通过 Java 堆空间进行限制 - 但调用级别嵌套要低得多。
为了验证假设,我创建了一个小型测试程序,该程序首先包装System.out20 次并打印堆栈跟踪以验证调用链。之后它包装System.out10_000 次并产生 StackOverflowException。
import java.io.OutputStream;
import java.io.PrintStream;
public class CheckPrintStream {
public static void main(String[] args) {
PrintStream originalSystemOut = System.out;
System.setOut(new PrintStream(System.out) {
@Override
public void write(byte buf[], int off, int len) {
originalSystemOut.write(buf, off, len);
if (len > 2) {
new RuntimeException("Testing PrintStream nesting").printStackTrace(originalSystemOut);
}
}
});
for (int i = 0; i < 20; i++) {
wrapSystemOut();
}
System.out.println("Hello World!");
for (int i = 20; i < 10_000; i++) {
wrapSystemOut();
}
System.out.println("crash!");
}
private static void wrapSystemOut() {
OutputStream tmp = System.out;
System.setOut(new PrintStream(System.out));
}
}
大约 6000 到 7000 个 PrintWriter 的嵌套足以产生堆栈溢出。
添加回答
举报