在写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"
但是,异常信息没有了彩色显示。
参考资料:
网友评论