首页 > 技术文章 > java中关于抛出异常的输出顺序问题

yu011 2020-06-02 00:21 原文

以下纯属个人拙见,如有不妥,还望海涵

  • 对比:
    在这里插入图片描述
    在这里插入图片描述
  • 代码示例
public class Demo{
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.setName("t");
        t.start();
        //睡眠5秒
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //中段t线程的睡眠
        t.interrupt();
    }
}

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"--->begin");
        try {
            Thread.sleep(1000*60);
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println("测试");
        }
        System.out.println(Thread.currentThread().getName()+"--->end");
    }
}

输出:
在这里插入图片描述

  • 删掉main方法中的睡眠5秒的代码后:
public class Demo{
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.setName("t");
        t.start();
        //中段t线程的睡眠
        t.interrupt();
    }
}

class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"--->begin");
        try {
            Thread.sleep(1000*60);
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println("测试");
        }
        System.out.println(Thread.currentThread().getName()+"--->end");
    }
}

输出:
在这里插入图片描述
这里的异常按理说应该在中间输出,但是跑到了后面。原因如下:

  • 控制台的两种输出方式
    1、控制台的输出方式总共两种,分别是:
    正常输出:System.out.println();
    发生错误时的输出:System.err.println();
  • 所以原因可能是:
    错误输出延迟打印到控制台了。

推荐阅读