|
大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。
: J% W6 }/ C. G8 }" d/ [- |package com.javazx.test.thread;3 w5 |* [6 S" a( v' z
% j0 B; l6 |0 Y/ V% kimport java.util.concurrent.ExecutorService;
3 B: ]2 t& {; x9 J, ]- Zimport java.util.concurrent.Executors;
6 L4 w- P% k) f5 ^& S
( s) n0 ?( o% |6 L/ ~$ \public class ExceptionThread implements Runnable {7 |: ~6 W3 x2 D2 m, J! e; m
public void run() {+ L0 k: V/ _ n E% I* s2 {
throw new RuntimeException("线程内部出现异常");
* l3 @( N) i' R L9 p. h" S }
& G' k6 F! L/ N0 r! |1 x5 I
- p! W0 J& M1 C& F public static void main(String[] args) {( e" ~% Q) ^) |% F% h* f
try {0 n( R9 V+ V( q% j; @
ExecutorService exec = Executors.newCachedThreadPool();2 u' T8 A( d1 Q5 q4 K8 H! ]! V* A
exec.execute(new ExceptionThread());
/ q) U$ ~4 p# A8 P5 j' ]5 q } catch (RuntimeException e) {
+ G* p" ~6 j' [9 J# ?1 D System.out.println("能捕获到异常吗?");( X& P1 c5 x; T P6 E
}
+ [/ ]. s( C7 N! {6 `$ e }1 N9 H8 T$ K% p
}0 n+ ?9 H3 Q; U" Y; i: f
5 D0 @- d' Q0 {9 u) ^( W8 k s, `7 z3 C
运行结果呢?6 D$ H+ C: d2 p; V5 G' ?/ p
Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常: g" d2 h5 Y8 b
at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)) F% p8 |% I& J
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
6 D, E& x4 p8 ?; H at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
4 z6 ?+ W$ t0 Z# y. J# Z- b at java.lang.Thread.run(Thread.java:748)
$ X4 U1 J/ p* o A+ W6 R9 g5 b! K4 C" Z$ r' k
& W4 S8 F; t" y4 w8 [( d
答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢 我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。- m/ X$ O: [4 g0 Q6 b# {
1、& i2 \( d8 L8 c' L) s
package com.javazx.test.thread;
% W7 T' n) l: L' f. w" b1 H3 j5 F: ]5 c, U5 ^
public class ExceptionThread2 implements Runnable {
& L: ]. R V# v( U4 ?" m' L* ^/ Z- K6 [
public void run() {
6 N( k/ K- t8 B# K) {& ^3 a2 C throw new RuntimeException("抛出运行时异常");
* r: E8 D. ]2 k' N/ X }; v$ D3 B9 K z# P @, _3 K
}+ R7 D5 }$ E& n5 c9 b
* }! q, f4 U- V% x0 S# V
2、* h' `+ b! [( ? h3 P
package com.javazx.test.thread;3 g4 }! O6 u% J1 e: F
8 k* w i1 {5 I
public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {& r9 [9 a3 C! r9 h( o0 S% `
public void uncaughtException(Thread t, Throwable e) {4 B c. J: A1 T3 h
System.out.println("捕获到异常:" + e);
9 k/ H, Q: P7 I6 g9 P" R } x/ |7 p- t0 A# K
public static void main(String [] args){
' I4 ^3 U i! k" p) y7 k0 e Thread t=new Thread(new ExceptionThread2());
1 ^. `8 V6 ^1 q: M& { t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());* _ n% Z: \4 B4 B5 X+ w0 ~
t.start();& N3 D4 r! ?* l+ u# J- | J
}5 M3 G7 z3 L1 R% B; H( i; X4 t% e5 f. D
}* _; u& m9 b8 R% J8 l- z2 a. z
* l0 i5 k% _( d8 N; |
, x6 \" E- ?: [
' r" b) i3 p( f( ?9 j( v4 t$ j) _
运行结果:
; b: O* M( ~6 o* Q+ R [; R7 y4 y捕获到异常:java.lang.RuntimeException: 抛出运行时异常
+ s) p- u* a! L+ ]( \) D' Z4 o" H* W& S* V3 y2 g$ w
# \% K1 B5 C& i0 x$ v% m0 z
终于捕获到了异常,大功告成!% _- ~9 m; _. q# s* T$ y
; `8 ?7 U; r! Q$ H" @
+ N/ }+ M$ A' L0 m; r
0 q' S7 Z" H2 i2 V e( b* X; m6 Z. t
|
|