Java语言中e.printStackTrace()和System.out控制台输出乱序问题

在写Java代码的时候,发现捕获异常后输出的e.printStackTrace()信息和程序中System.out输出的信息在控制台输出的顺序比较混乱,而且不稳定,经常会变。下面是一个例子:

/**
 * Created by chengxia on 2019/7/2.
 */
public class TestPrintStackTrace {
    static void exceptionOccur(){
        int nums[]=new int[3];
        System.out.println("Before exception occurring.");
        nums[6]=10;
        System.out.println("Exception occurring, this won't be displayed.");
    }
    public static void main(String []args){

        try {
            TestPrintStackTrace.exceptionOccur();
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("This is an output before printStackTrace.");
            e.printStackTrace();
            System.out.println("This is an output after printStackTrace.");
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("Run over...");
    }
}

如下的图片列出了两种运行的结果。


"run output 1"
"run output 2"

使用printStackTrace()的时候默认是输出到System.err中去的,而普通的输出都是放入System.out,这两者都是对上层封装的输出流,在默认情况下两者是指向控制台的文本流。所以两者可能会出现同步问题。可把e.PrintStackTrace()改为
e.printStackTrace(System.out);
,指定printStackTrace()的时候指定输出流为System.out就可以解决这个问题。如下:

/**
 * Created by chengxia on 2019/7/2.
 */
public class TestPrintStackTrace {
    static void exceptionOccur(){
        int nums[]=new int[3];
        System.out.println("Before exception occurring.");
        nums[6]=10;
        System.out.println("Exception occurring, this won't be displayed.");
    }
    public static void main(String []args){

        try {
            TestPrintStackTrace.exceptionOccur();
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("This is an output before printStackTrace.");
            e.printStackTrace(System.out);
            System.out.println("This is an output after printStackTrace.");
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("Run over...");
    }
}

这样,修改之后,输出顺序就符合预期了,而且不会变。如下图。


"run output Sytem.out"

但是,异常信息没有了彩色显示。

参考资料:

  • 【技术】Java入门:e.printStackTrace()和System.out输出顺序混乱的问题

你可能感兴趣的:(Java语言中e.printStackTrace()和System.out控制台输出乱序问题)