美文网首页Java 杂谈
Java语言中e.printStackTrace()和Syste

Java语言中e.printStackTrace()和Syste

作者: SpaceCat | 来源:发表于2019-07-02 19:50 被阅读2次

    在写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()和Syste

        本文链接:https://www.haomeiwen.com/subject/rtothctx.html