|
大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。! w9 r- n1 c) [
package com.javazx.test.thread;! ?7 s. U3 d" s/ w Y" o. X y
) _0 c' B2 u$ x1 p4 ^9 H& E- }! i
import java.util.concurrent.ExecutorService;3 q! U1 N5 I& R0 h2 Y$ G
import java.util.concurrent.Executors;, Z5 e' P2 x4 v7 ~$ S
0 V) W" v7 e! I# a5 H1 B) m: Tpublic class ExceptionThread implements Runnable {: d6 A6 a A$ M: G* o
public void run() {6 Z, z5 y, s7 X
throw new RuntimeException("线程内部出现异常");6 `" T% l5 y: N5 V" N
}
, a/ Z' B& L; F! G3 t. Z: i! u: O8 ?4 d2 b: H) I
public static void main(String[] args) {5 S" U% S, K( f- C) f: D: Z
try { ]$ W# {9 n8 {) M3 z7 r2 j: ]
ExecutorService exec = Executors.newCachedThreadPool();4 t! a% { j: M3 t5 s
exec.execute(new ExceptionThread());
* c9 d% d1 {" @8 K- [! O } catch (RuntimeException e) { Y6 V# l5 r6 ^8 ?8 e' {
System.out.println("能捕获到异常吗?");1 \' ~1 M) ?# O# A
}7 M0 B7 y* M* o% m% t
}3 L0 R; L& \" s1 u
}( Z) m3 i8 ]! r; V9 D4 Z
4 \5 L; F4 {% n8 R$ I6 i& t, |( C
3 I" ^3 F& i) `运行结果呢?4 u4 ~" f, m- q" D
Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常9 C: B& i; g# B6 e- n* |
at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)
7 _; [3 @0 Q O6 v- \! \ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
1 h! o6 W" B; a at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
" B* M3 |; B7 y' [& [ at java.lang.Thread.run(Thread.java:748)6 ?6 R& q& {/ J2 s
1 ?3 E% _+ K/ L
8 h- m8 } p. `) f6 X3 e答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢 我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
& q& K) X5 [5 v% X( G1、% i3 r2 Y; [* K( X- ~6 l
package com.javazx.test.thread;( L8 b+ a) g4 ]9 o% U; W Q0 r
+ s; u; c( T g1 [, s: L+ Apublic class ExceptionThread2 implements Runnable {
" m' I4 z- ~) i5 k; [" ~
) ]3 t) Q) l' F. Q. q* ?1 g+ V, i public void run() {
. L8 `! e n+ y$ B1 F throw new RuntimeException("抛出运行时异常");
( w7 ` S: v& Z$ U8 V6 O& R }
4 a$ x& g3 q" u- ]$ D" H1 F6 n0 l}
9 h& L0 a+ c5 D0 w5 e- \
7 X% r1 F3 s1 ~2、
% x( }* |. M, h2 s$ gpackage com.javazx.test.thread;
' }) d& B" ~# D' b: a `4 C' g4 z& y/ b7 {( w/ p# G
public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {' H/ S; l7 Z. }) e! o2 a# M0 w( r! ~
public void uncaughtException(Thread t, Throwable e) {# \+ A- Z0 o! t' _" w1 h3 E
System.out.println("捕获到异常:" + e);
: R* ?- a+ Y+ ~8 }. n- z6 O }- {; y. y0 I. h- s1 U
public static void main(String [] args){
" B. A( r% i# r. l Thread t=new Thread(new ExceptionThread2());
+ F, J( @) ?. w) Y/ P t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
' r8 a& J1 P, i: } t.start();
8 w b* m0 f+ X* w' q/ V& b }0 V3 W" j W8 w
}
, {( D! Q( V( u0 ?. c
: j3 e* X( r X$ I# X% R1 R s) I
' T8 g( h2 v' @# w3 G5 n' M运行结果:+ _/ F4 @% e. R0 p5 f" q
捕获到异常:java.lang.RuntimeException: 抛出运行时异常
2 G" \; u8 ^& T+ T4 Z0 a
4 A u* F& r0 `( C# T5 U% @, f' c; O8 B( h: h) L
终于捕获到了异常,大功告成!
& ?9 f6 w5 n' `' w
( ]7 _ n7 R. B4 m5 e
' k5 h$ |3 [' [
$ U" L) [( c6 e* g$ \ |
|