javazx 发表于 2017-11-3 15:42:36

java线程中的异常捕获 用try catch能捕获得到run中抛出的异常吗?

大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。
package com.javazx.test.thread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExceptionThread implements Runnable {
    public void run() {
      throw new RuntimeException("线程内部出现异常");
    }

    public static void main(String[] args) {
      try {
            ExecutorService exec = Executors.newCachedThreadPool();
            exec.execute(new ExceptionThread());
      } catch (RuntimeException e) {
            System.out.println("能捕获到异常吗?");
      }
    }
}


运行结果呢?
Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常
      at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)


答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
1、
package com.javazx.test.thread;

public class ExceptionThread2 implements Runnable {

    public void run() {
      throw new RuntimeException("抛出运行时异常");
    }
}

2、
package com.javazx.test.thread;

public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {
    public void uncaughtException(Thread t, Throwable e) {
      System.out.println("捕获到异常:" + e);
    }
    public static void main(String [] args){
      Thread t=new Thread(new ExceptionThread2());
      t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
      t.start();
    }
}



运行结果:
捕获到异常:java.lang.RuntimeException: 抛出运行时异常


终于捕获到了异常,大功告成!



页: [1]
查看完整版本: java线程中的异常捕获 用try catch能捕获得到run中抛出的异常吗?