gpt4 book ai didi

java - 了解 Java 堆栈

转载 作者:IT老高 更新时间:2023-10-28 21:13:04 25 4
gpt4 key购买 nike

有这个代码:

public class Main {
public static void main(final String[] args) throws Exception {
System.out.print("1");
doAnything();
System.out.println("2");
}

private static void doAnything() {
try {
doAnything();
} catch (final Error e) {
System.out.print("y");
}
}
}

还有输出:

1yyyyyyyy2

为什么它只打印八次“y”而不是更多。 Java遇到StackOverflowError时如何调用println()

最佳答案

在这里你捕捉到的是 Error 而不是 Exception 在这种情况下你的程序会崩溃。

如果你试试这段代码(修改为添加静态计数器)

public class StackError {

static int i = 1;

public static void main(final String[] args) throws Exception {
System.out.print("1");
doAnything();
System.out.println("2");
}

private static void doAnything() {
try {
i++;
// System.out.println(i);
doAnything();
} catch (Error e) {
System.out.print("y"+i+"-");

}
}
}

输出

 1y6869-2

所以,它得到了 stackerror 6869 次(不同运行的变化)并打印了最后一个值。如果您只是像之前那样打印 y ,那么输出可能会被缓冲而不被刷新,因为它不是 println


更新

System.out.println 内部调用缓冲的PrintStream。您不会从缓冲区中丢失任何数据,它会在填满后或当您显式调用 flush 时全部写入输出(在您的情况下为终端)。

回到这个场景,这取决于堆栈被填满多少的内部动态以及能够从 doAnything() 中的 catch 中执行多少打印语句以及这些数字的字符被写入缓冲区。在主背面,它最终印有数字 2

javadoc reference to buffered streams

关于java - 了解 Java 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15083318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com