java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3211|回复: 0

java线程中的异常捕获 用try catch能捕获得到run中抛出的异常吗?

[复制链接]
  • TA的每日心情
    开心
    2021-5-25 00:00
  • 签到天数: 1917 天

    [LV.Master]出神入化

    2093

    主题

    3751

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66773

    宣传达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2017-11-3 15:42:36 | 显示全部楼层 |阅读模式
    大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。/ ]* Q1 H/ G; a. _; M' ?4 q
    package com.javazx.test.thread;9 x" x4 g. E# ^5 p1 k* I" O, y5 A5 z
    * \! L% s1 W! E( W# M1 E, k
    import java.util.concurrent.ExecutorService;. b- f- v* s+ m
    import java.util.concurrent.Executors;. O+ j+ J1 k4 L
    8 c! r2 p8 e8 O" C/ @# ?
    public class ExceptionThread implements Runnable {
    6 ]  \7 G, F/ ^! w( R/ C5 o    public void run() {" h( `; D. W9 a* w* x) ?
            throw new RuntimeException("线程内部出现异常");0 N9 ~# a; V7 Z* X8 p! c
        }- F' K0 u/ c0 t$ C" P3 _

    - \3 _$ z6 o: N( ?    public static void main(String[] args) {8 W4 Y" v; _/ [. F# n" D% A6 \, S
            try {/ z+ l$ V( l5 M1 x
                ExecutorService exec = Executors.newCachedThreadPool();2 _- e- p) c& b: n
                exec.execute(new ExceptionThread());6 [0 B, o- n- s
            } catch (RuntimeException e) {
    . x* X/ O0 o% b9 I0 H  O            System.out.println("能捕获到异常吗?");4 n$ h  S4 u5 Q$ D  j) H
            }" D; |9 C9 {7 h9 Z
        }6 T* g0 ^6 M- [  T% o/ ^# n" E
    }! _0 {7 C. m6 t. l4 z

    ; e( A* \, U7 K5 ~+ [/ D7 F
    3 a, p8 ?) q; U, a3 {8 p运行结果呢?
    / {8 O( W1 C' |- s3 v  QException in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常
    % A$ {, E, N2 J7 s0 b        at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)
      `/ O1 p5 Y  ^5 U        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)* w$ w1 y: Z2 r% f% g
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    8 J+ i. s5 S, \8 N0 H        at java.lang.Thread.run(Thread.java:748)1 u! I3 ^8 f' G+ k+ F% w8 n6 Z

    # H: o) @  S9 y- y' ?0 Y; _1 @* K4 ]. R$ I' o: |
    答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢  我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
    * R3 C+ R, ]/ f1、
    5 ?! x) a- G1 F: t, V) u* t0 E6 c( _package com.javazx.test.thread;
    $ i9 a, }6 f" j* W- t: h
    $ H% e2 x* J" }+ t0 }
    public class ExceptionThread2 implements Runnable {+ Q! @/ b) ?( M& V" M

    : O2 k# H+ u1 _    public void run() {! t2 i- ^) Q: ?& V3 \
            throw new RuntimeException("抛出运行时异常");3 ~4 v4 s/ w* S; ^+ M; l! f8 v. u
        }7 y6 t# \' Y" R
    }3 v  |( l6 Q0 o+ Z" v

    3 U) p0 ~/ D6 l7 q5 F/ j2、; ]/ H. y, B7 S8 o! x9 v% v
    package com.javazx.test.thread;
    9 E9 ?1 _2 Z9 b& i7 @- C9 v

    0 R  [: X; m4 h/ n: r3 u' z" H
    public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {- f7 ^* Y) _8 x  o. Y
        public void uncaughtException(Thread t, Throwable e) {9 n& B& ^/ d  L$ M7 \# P" W* S7 o
            System.out.println("捕获到异常:" + e);
    4 g1 D  {& D: z5 R" S0 a
        }+ ^& i& e& H. u5 _9 x
        public static void main(String [] args){
    7 @- e; @" \5 w& z% X+ z' M: `        Thread t=new Thread(new ExceptionThread2());- M0 t8 z, V- Q5 i2 a7 U8 d! \' V
            t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
    " y6 D0 t7 B( i6 T$ P0 |
            t.start();
    5 a. j) {# x8 k3 l# T
        }
    5 ~- |2 C- n" }7 b/ @2 \* ]( `}
    7 i) z" }4 E' z( C& R
    0 H  U. L* Y9 P: L( s, F
    + d8 i( \% r* ^$ U! y) o8 L; ?

    $ q+ d& G( B" H$ n运行结果:5 A* u) d' D. f1 F( ^7 q
    捕获到异常:java.lang.RuntimeException: 抛出运行时异常
    % b3 e; h3 Z3 T9 Z5 ^- S' Y" ~
    $ A4 i/ L: X% Q6 J3 E, K) t
    / N: w' G, B- }' \
    终于捕获到了异常,大功告成!. I$ \# M1 v$ ^9 J" y4 a% O* {
    ; R* z; ?+ S) h* u9 t  O/ @, ~
    + K" C3 q$ ~+ |- U
    * i+ ~$ ?# R" _" [0 W0 H
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Java自学网

    GMT+8, 2025-3-29 08:18 , Processed in 0.326018 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

    快速回复 返回顶部 返回列表