|
大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。
+ K! L- q4 ^ p* L6 C, F9 Opackage com.javazx.test.thread;: ^' o! [4 E% ]
* [; i1 }- k) f2 U e ~. X' uimport java.util.concurrent.ExecutorService;
. b, D, T7 Z) v* s- z! Zimport java.util.concurrent.Executors;) F: [ |; s' O" l. X+ U8 Q
; K" k! S4 W8 u2 Epublic class ExceptionThread implements Runnable {
5 S' }; Q8 B8 o. S9 Z. W public void run() {
a% C8 j8 d7 s% Y, q; R8 G throw new RuntimeException("线程内部出现异常");4 N! W9 U; q; A- u0 a" s
}
3 O9 y8 Z$ n9 B' S
% b" `6 l" Z9 _7 r( A( v, q7 n, |6 h+ v public static void main(String[] args) {
" K* M7 N* y$ G8 _& n1 Q# V try {
& g5 l# D3 `0 H3 X1 ~/ H! U ExecutorService exec = Executors.newCachedThreadPool();& E" y) ~$ l% O, P
exec.execute(new ExceptionThread());
& Z4 f! M9 f( n* _ } catch (RuntimeException e) {
1 }! N6 L7 j! r6 o1 y7 `/ W; ` System.out.println("能捕获到异常吗?");7 H$ ~) B: \+ x0 g
}+ ?- q1 w C' S h. d; |1 f
}9 {& U. Z+ t' E% |/ Z
}
7 C9 g$ R. N- Q/ U3 z: ^2 Q0 Q) b' q
; l3 y" X9 w; b. S# o- m* |运行结果呢?
# w% B$ \0 x4 k; c* M3 \Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常5 `8 K/ a% m/ _: p
at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)
' T4 j7 `& m J7 O! `/ A5 L8 [ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)' g! p$ ]: D5 m4 `1 E8 _1 d1 l$ i
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)) a9 S8 V7 Q! L& f
at java.lang.Thread.run(Thread.java:748)% C9 r+ h2 @$ @/ g
2 W$ \# I" v' o& a6 ^) [! w ^5 [( d: q) M
答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢 我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
' T) d. ?6 U u, M5 D1、8 \3 ^6 U, B7 I4 T3 {" n9 e' P
package com.javazx.test.thread;
+ p: Z2 h; D- c* l2 Y" d7 P5 A. X: B
public class ExceptionThread2 implements Runnable {9 a$ c0 H4 l5 G6 V' G( \' `
6 f" K- U+ o+ k, X! j7 g" o public void run() {0 c# i4 r# M, ]# I+ g+ _' O
throw new RuntimeException("抛出运行时异常");
) F% K# t2 j; \, p }; p( E; |1 Z8 R; V2 i& e+ H" l' m
}
; h7 z/ I9 \; t/ a4 [# k
: ]) P$ b/ p& M- n% j' ^2、
- X+ x w) [- X. o! q8 dpackage com.javazx.test.thread;
6 x6 i6 n. n- }$ l; P* `& K) t# q/ {5 q* p3 i! C
public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {8 v) B, [) {) |
public void uncaughtException(Thread t, Throwable e) {1 h* U( Q5 H0 \. {7 ~3 p7 q# l8 r0 M
System.out.println("捕获到异常:" + e);8 J% V( h; E! P W" c% C
}
6 `- i: U _) M8 G& I5 C/ ~, o3 i public static void main(String [] args){ B; o. y4 O( g8 T, G
Thread t=new Thread(new ExceptionThread2());% C" c4 m1 t ^7 [. H9 i
t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());9 w! R: Z+ n/ H: W
t.start();
0 \/ l! F+ H- A) Q2 r }
. W7 I& i- W1 A1 V, I}
& u& C2 L! y; A
9 G" _9 H q3 B5 P- n7 V
) Z0 w3 ~- v- O% w, C' T0 P
* ^) L3 K- F0 i D运行结果:
1 H3 y3 |; L1 | o: ?& w2 [1 k捕获到异常:java.lang.RuntimeException: 抛出运行时异常7 \ E4 Y. \2 D$ z! A/ l
; `+ M/ K6 ^5 J* V- g( R& b! r& ]+ _; n; z; ?, i) \# `: U
终于捕获到了异常,大功告成!
! H, P8 B w' w R, D+ x
5 T; Q' a4 Y0 D0 ~* P; J, N1 S
/ C. H8 k4 X3 P3 y% V% n# L, m' m! ?+ _( ~
|
|