|
大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。8 K' B B! |. c0 m
package com.javazx.test.thread;, M$ }4 c9 @, ]+ d* A
& I" A- }! j, \ P" j, n- r
import java.util.concurrent.ExecutorService;, Z. s* Q. R3 P! X
import java.util.concurrent.Executors;) e! F. z0 O9 v: N' j! Y
4 M0 T. P0 z. b- T* dpublic class ExceptionThread implements Runnable {( t/ C/ m5 ]5 y0 \/ ~+ v
public void run() {
% {- V6 k' {( H throw new RuntimeException("线程内部出现异常");
$ f% X2 {1 Q; w! i5 K8 ~/ A }
I4 T2 ^+ s, U {8 ?& B* w, h: |# }
3 N l7 o ]/ H9 T$ x2 m public static void main(String[] args) {
3 n( i' V! l. ~, ~/ C" S try {0 Y% c$ s0 {9 V2 K/ M! j6 I
ExecutorService exec = Executors.newCachedThreadPool();
7 n' ?2 I# H, @% B1 q1 O1 R exec.execute(new ExceptionThread());
* |1 N# o1 U8 u9 _- J4 X* v$ Y } catch (RuntimeException e) {
% P8 v6 M$ n' z System.out.println("能捕获到异常吗?");
( q) N/ C6 D+ ]. b8 w* A0 l }+ _: @8 o& s& _5 u. m
}
+ ~7 w$ L! j E& M U. |/ M}
# g% h/ ^- B# \5 h( ~, j; u3 j( I6 B- ~
% Z2 V4 v e' ]7 h/ z
) e+ M: [: ^- a# q( s+ Y3 I7 G运行结果呢?
1 |, d6 ~ x/ [) DException in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常) o* D. T# E& }& i, _" V) _
at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8) {* h, L* k. |0 I" @
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)7 ^9 r M- L h" y8 I2 ~
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
$ B0 z1 ^- k" B6 G9 \ at java.lang.Thread.run(Thread.java:748)
& E# H) @6 `# o: ~3 K+ |2 b* m4 }& I R) [+ L4 v4 O: X
6 y( Z6 S* T6 `- j答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢 我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
% j* u0 }! q3 A* t! f, h# y1、1 {8 e# z/ m3 j% \( w( l
package com.javazx.test.thread;9 X$ x/ F+ \ n; z' Q( O
0 U( k' m' u u/ a% m% Cpublic class ExceptionThread2 implements Runnable {& S! @: V0 b# D) K9 f' a* P2 L; Y
5 W3 K- H& ^ G* |
public void run() {
; S- X d, y; b throw new RuntimeException("抛出运行时异常");1 f: E1 t( M; Y% ? u
}& {* X' r1 p/ z: w
}8 h0 o& `+ L. k& {" |: Q5 {
, n7 q4 Z( d$ f
2、+ R5 a' P; B! n
package com.javazx.test.thread;$ e/ x& g6 r% g0 p$ Y
2 ]6 d: U+ _1 T/ wpublic class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {, p: Z) l# G2 P" I" @, `
public void uncaughtException(Thread t, Throwable e) {
* l- y4 A+ _9 v# q5 m System.out.println("捕获到异常:" + e);; l2 H3 {9 k- f( {& A
}! z% \. ?5 ^9 v
public static void main(String [] args){
: T# q G3 a9 ]0 e1 s& r/ z! @& m Thread t=new Thread(new ExceptionThread2());
$ ~+ ?# F- U K9 _ t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
' n. J, N6 A! \% Z t.start(); o( k* {' \ P9 Q
}
' x) o6 K8 a: n" P' o% @. Y}; {" u3 e# w/ i. o
: V8 V! q1 |% y) O, w" ^, n7 y v. K8 x( m% S6 w( V7 V
) x: b/ c' Z N* I. [2 n/ r1 P. B运行结果:
: w. Q, n6 z" a6 J8 v4 p* F捕获到异常:java.lang.RuntimeException: 抛出运行时异常
1 m5 }2 p6 t/ Q e. i' W5 C- D# L# H
9 L: r( e0 K2 O3 a9 F4 H终于捕获到了异常,大功告成!3 X) f. \0 X! R. A: X1 h
; F1 ^' z# h% `$ @) g
* f( j6 B; I7 l) g& Z+ E$ j7 s' r8 Z: a) C( {4 d
|
|