我发现一个有趣的案例:
public static void main(String[] args) {
int a =0;
int b = 2;
int c = 10;
int d = 0;
int e = 0;
try {
d=c/b;
e=b/a;
}catch (ArithmeticException ex){
System.out.println("TEST");
ex.printStackTrace();
}
System.out.println(d);
}
将有两种打印顺序:
1
TEST
java.lang.ArithmeticException: / by zero
at Chapter10.Test2.main(Test2.java:14)
5
2
java.lang.ArithmeticException: / by zero
at Chapter10.Test2.main(Test2.java:14)
TEST
5
但是当我评论System.out.println("TEST");
行时,将只有一个订单:
5
java.lang.ArithmeticException: / by zero
at Chapter10.Test2.main(Test2.java:14)
所以我想问一下try-catch块的执行顺序是什么顺序?为什么发生异常时,在System.out.println(d);
块之前执行catch
?
答案 0 :(得分:4)
printStackTrace
写入System.err
,这是与System.out
不同的流。将代码更改为ex.printStackTrace(System.out)
,以获得一致的输出。
public static void main(String[] args) {
int a =0;
int b = 2;
int c = 10;
int d = 0;
int e = 0;
try {
d=c/b;
e=b/a;
}catch (ArithmeticException ex){
System.out.println("TEST");
ex.printStackTrace(System.out);
}
System.out.println(d);
}
会产生
测试
java.lang.ArithmeticException:/零
在Chapter10.Test2.main(Test2.java:18)
5
符合预期。
答案 1 :(得分:1)
默认情况下,Exception.printStackTrace()
使用System.err
作为PrintStream
,与System.out
不同。所以代码执行的顺序:
System.out.println("TEST");
ex.printStackTrace();
System.out.println(d);
可能与实际输出不一致。可以肯定的是,5
将在TEST
之后打印。可能会显示异常消息:
TEST
之前TEST
和5
之间5
之后。答案 2 :(得分:1)
您需要与“ System.out”而不是“ printStackTrace()”一起使用。