|
大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。1 {5 }- M$ x2 {3 l! ^! R! R
package com.javazx.test.thread;
. j6 H. y2 l# K+ a% z! s5 T7 D0 K
9 K1 d } R/ h& Q5 Nimport java.util.concurrent.ExecutorService;
/ e3 b- X# ^8 I7 J# q1 c* z# Simport java.util.concurrent.Executors;
" W& ~- _ [: [ L) ]
1 B: r1 i* H: g( Wpublic class ExceptionThread implements Runnable {7 k9 q- w# Y4 ?3 v) x0 W
public void run() {
3 L# |0 Z( ?( H5 ~5 R: E7 \# ~2 U throw new RuntimeException("线程内部出现异常");- T ?" a9 ]' ~' X; q! Z
}4 e7 [4 i- H% R4 m B+ |
( }! C5 r$ _7 T5 _ D, k( G
public static void main(String[] args) { o/ a8 v& Y9 a, P& p5 l( t
try {
# B4 m' K7 R3 @9 q& i/ K ExecutorService exec = Executors.newCachedThreadPool();% h. |" E" O$ q5 ]. s" E
exec.execute(new ExceptionThread());
9 R# L6 K7 |. K: M: a0 B8 B5 x5 U- \9 O } catch (RuntimeException e) {
$ b7 C9 j, o0 u$ {2 H System.out.println("能捕获到异常吗?");
2 f/ [& ~* B( e& Q6 S% \ }
! }9 K, I# G7 Z( @8 K+ k- t }
8 n9 ~# G- B4 d}& `! _8 v& k" y7 ^
4 m4 T7 q. S3 q K E3 r! z9 V* ^, h' x, }
运行结果呢?. C1 N6 N# f J* F
Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常
6 G, I5 T( G/ b at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8) Y7 k; x, K4 E K
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)9 v$ F8 y$ k- e5 e9 w. L5 [# Y
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
6 N- a' R5 _8 e+ I) u at java.lang.Thread.run(Thread.java:748)& o/ i- N4 }8 r5 n/ b' r
! L' n, _6 G. U
( N# N, f9 L) k- l3 G+ k答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢 我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。/ T3 L5 o- z& d6 Z+ g! Q
1、
/ O- i; t9 p9 D) W- a# c$ q' c) Opackage com.javazx.test.thread;" d# ~+ ?6 C, ~( V$ }
6 h( k) T; W B: U4 R
public class ExceptionThread2 implements Runnable {
3 ?# p; O" i% g. h+ q6 j( F
4 A# B1 K8 z7 u) e public void run() {# L4 i4 O& h2 ? s- d& H( Q
throw new RuntimeException("抛出运行时异常");
. C* g/ y, c& S, l+ B3 ?6 u }1 z1 H, }* ?. i4 w( [
}
2 x; c# Y8 x# K, |+ z" H% O3 G5 z/ D8 e' Z4 D! I9 V
2、* D0 q/ h7 F! C4 Y; J5 `' p
package com.javazx.test.thread;
, k0 A! X" ~, k' M! n6 ~+ V3 [* l" `4 j
public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {
9 A0 }3 u* [( i public void uncaughtException(Thread t, Throwable e) {
. }# ?. e. Y- z System.out.println("捕获到异常:" + e);
( @" F0 k3 A" w- ^ }4 \# w; q9 W0 b3 G4 ~
public static void main(String [] args){
0 e2 k5 H: L( a+ U8 Y8 ? Thread t=new Thread(new ExceptionThread2());- x( f* {. z, ] ~: h- n X4 r
t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());8 L$ H- t% W* Z" o2 ?
t.start();: ^9 f0 |. @, g) J" E
}
4 ^9 m, z9 d" s' [0 A7 e, L; w}) F2 O6 i! k0 r7 S" V
9 S# @, v5 _& S6 J3 ^+ m) B. k5 Q
( U7 Y2 h6 F6 q0 ], Z% w
4 M% H* P" `' K5 i6 C/ G$ N
运行结果:
- ?; M& @4 D6 U% ?0 U捕获到异常:java.lang.RuntimeException: 抛出运行时异常) n% h o. g: W0 j$ T
( c1 |- I# f4 ]8 ^
# w7 P; J2 h# e- P9 o2 u终于捕获到了异常,大功告成!
( n. [( Q1 \. q1 p
3 D: I, ^% m' e5 h# B7 a. c" v* A8 v! w$ E
2 `' j7 g& o! t. y1 y2 n
|
|