java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2820|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66093

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

    发表于 2017-11-3 15:42:36 | 显示全部楼层 |阅读模式
    大家都知道在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' u
    import java.util.concurrent.ExecutorService;
    . b, D, T7 Z) v* s- z! Z
    import java.util.concurrent.Executors;) F: [  |; s' O" l. X+ U8 Q

    ; K" k! S4 W8 u2 E
    public 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! ?+ _( ~
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-25 22:27 , Processed in 0.104833 second(s), 31 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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