gpt4 book ai didi

java - 为什么 printStackTrace() 和其他方法之间的执行顺序似乎是不确定的?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:33:30 27 4
gpt4 key购买 nike

在我下面的代码片段中,printStackTrace() 方法在 catch block 中被调用。运行程序后可以看到,有时候printStackTrace()会连续运行几次,而不是按照printStackTrace()的顺序运行 --> catch block --> 最终 block .

如果将 static boolean b 更改为 false,则 System.out.print(e) 会按顺序执行。

那么为什么 printStackTrace() 会以不同的方式运行? (有线程的东西??)

public class PrintStackTrace {
static boolean b = true;
public static void main(String[] args){
for(int i = 0; i < 100; i++){
try{
throw new Exception("[" + i + "]");
}
catch(Exception e){
if(b){
e.printStackTrace();
}
else{
System.out.print(e);
}
System.out.print(" Catch: " + i);
}
finally{
System.out.print(" Finally: " + i);
}
System.out.println();
}
}
}

最佳答案

因为printStackTrace写在System.err上,而System.out.println写在System.out上>。即使 System.errSystem.out 对输出消息使用相同的底层资源(例如相同的文件或相同的控制台),它们也会在不同的时刻刷新。

如果你想要一个同步输出,把异常也写在System.out中:

e.printStackTrace(System.out);

或者更好的是,使用记录器,它已经将输出同步到共享资源中,并为您提供更多有关消息输出内容的选项,例如类、方法、日期和时间、线程名称等,还有其他好处,例如在数据库而不是文本文件中写入日志消息等。

关于java - 为什么 printStackTrace() 和其他方法之间的执行顺序似乎是不确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23588123/

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