如何解释Java中try-catch的输出顺序?

时间:2018-06-24 08:46:28

标签: java try-catch

我发现一个有趣的案例:

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

3 个答案:

答案 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之前
  • TEST5之间
  • 5之后。

答案 2 :(得分:1)

您需要与“ System.out”而不是“ printStackTrace()”一起使用。