|
大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。1 l3 L$ S. K+ |* o, S3 x% t5 e
package com.javazx.test.thread;
4 @. U1 I% z- A2 V; N( J0 v2 q. |
import java.util.concurrent.ExecutorService;
% Z" Z0 q7 n+ f% ^$ }+ l& |$ E Wimport java.util.concurrent.Executors;
# M$ {* B' e1 I: R1 E
. W( E1 i& w+ D; rpublic class ExceptionThread implements Runnable {
. F3 v6 p" K6 m) \/ { public void run() {7 O9 C( f# }- ], f! ^$ b. H
throw new RuntimeException("线程内部出现异常");
! H% H" k9 S$ }* x: Y4 R- ` }
, {# y7 }" g3 K5 ~2 @+ z/ Q$ |6 v! X3 J2 D, {
public static void main(String[] args) {
* n5 a+ i1 _( f- L( S( d+ q2 B; R try {5 E: J8 P3 A3 `" y L( g
ExecutorService exec = Executors.newCachedThreadPool();8 k# p7 E, i8 e
exec.execute(new ExceptionThread());
: O. ]1 x7 ]$ L( \6 R2 K } catch (RuntimeException e) {
0 g3 v7 B, }. h7 T2 {6 ?' h System.out.println("能捕获到异常吗?");
, E- Y2 y2 T! ~* p# z: l; N* k }
( l: ^0 ]7 g* f }
' [# L$ j% R. E- y- K! ^, h0 ~}) Q) b! E$ d4 S5 t/ I
4 u2 e4 S3 E: G, I! u, U9 E* A1 L1 M. {& ^9 G- c
运行结果呢?; X8 K$ ]" E& o) r& ]
Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常
3 a" g1 q2 V! u4 [ at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)" s$ K2 }9 Y% A3 j
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)! i/ K O8 l2 |8 ~
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
( V0 b% C' u+ V9 x! c at java.lang.Thread.run(Thread.java:748)
4 Y" Y& J! |& g1 _9 I( v. T$ b
) C# e9 \& I) T$ m% u6 J f3 D: u7 _. G
答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢 我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
0 m, j9 h/ F+ r6 i7 o w5 a1、6 o) O* ?; u* H
package com.javazx.test.thread;5 ?* w% T& R3 ?# w
$ b9 o) A l" W2 l" q6 P8 s5 Z( W
public class ExceptionThread2 implements Runnable {
" K' C0 `6 g' x1 s" ^% Q6 d0 h9 I- F* I1 U2 G
public void run() {
* _, P' }, a3 ] throw new RuntimeException("抛出运行时异常");5 B6 p) S% x; r* @5 b+ w) O5 ^
}8 x0 W) j8 K& j
}9 v# M2 y" _0 B) T
3 Z* T9 H% y6 Z6 ^# P2、, b2 O; Y' b0 y3 B# r+ s& i
package com.javazx.test.thread;
) H, d! K) ?7 e! u3 _: `) W
. d: d$ r; w! y" F( cpublic class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {
" k6 m4 |, {$ D public void uncaughtException(Thread t, Throwable e) {) d: m+ s" Y4 V: X
System.out.println("捕获到异常:" + e);
% K) B9 G# O$ [- `4 X2 o }$ I4 w& s7 o8 O1 D+ T$ m4 R
public static void main(String [] args){1 Z# V# `' {$ S( M5 G$ B0 X
Thread t=new Thread(new ExceptionThread2());* \% P" @8 A( ]/ l9 W( |' R
t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
0 e L, s4 M8 v" I t.start();
* \ d3 I2 ~' r6 U) o }
) `6 _- a5 o* `$ T8 A1 [}
* K; P F+ N$ S5 Q" k& {0 I7 z( Q$ w! M
8 ~$ L. j' b2 j1 @ t8 E7 w5 ^
6 ^& D* @& s) t! \0 g* w运行结果:! A. C& m3 w) G* w+ z
捕获到异常:java.lang.RuntimeException: 抛出运行时异常
6 K* Q4 K; s3 H: B8 ^, W( |
* N1 E- n( Y4 L; }1 n
2 U& N/ ]! k. G( F1 l/ N4 U7 k终于捕获到了异常,大功告成!; U! [ }+ X3 q( Y1 G
2 L/ \" J& y6 z+ K9 o f
0 ?: l; O. m& F" G+ K% I
[* D" Q5 ]4 o! J4 f Q |
|