4

在我下面的代码片段中,该printStackTrace()方法在catch block. 运行程序后可以看到有时会printStackTrace()连续运行多次,而不是按照printStackTrace()--> catch block-->的顺序运行finally block

如果更改为static boolean bfalse则按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();
        }
    }
}
4

1 回答 1

14

这是因为printStackTracewrite in System.errwhile System.out.printlnwrites on System.out。即使两者都System.err使用System.out相同的底层资源来输出消息(例如,相同的文件或相同的控制台),它们也会在不同的时刻刷新。

如果您想要同步输出,请同时写入异常System.out

e.printStackTrace(System.out);

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

于 2014-05-11T01:55:42.930 回答