了解Java堆栈

有以下代码:

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”。遇到Javaprintln()时如何调用?

回答:

在这里您正在捉住,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

因此,它已进行了stackerror6869次(不同运行次数的更改),并打印了最后一个值。如果只y像以前那样打印,则可能是输出被缓冲而不被刷新,因为它不是println。

更新资料

System.out.println内部调用PrintStream该缓冲。您不会丢失缓冲区中的任何数据,它会在缓冲区填满后或显式调用flush时将所有数据写入到output(在您的情况下为端子)。

回到这种情况,这取决于内部动态:堆栈已被填充满,多少个打印语句能够从捕获中执行,doAnything()并将这些字符数写入缓冲区。最后在主背上印有数字2。

以上是 了解Java堆栈 的全部内容, 来源链接: utcz.com/qa/399381.html

回到顶部