java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2846|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66123

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

    发表于 2017-11-3 15:42:36 | 显示全部楼层 |阅读模式
    大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。8 K' B  B! |. c0 m
    package com.javazx.test.thread;, M$ }4 c9 @, ]+ d* A
    & I" A- }! j, \  P" j, n- r
    import java.util.concurrent.ExecutorService;, Z. s* Q. R3 P! X
    import java.util.concurrent.Executors;) e! F. z0 O9 v: N' j! Y

    4 M0 T. P0 z. b- T* d
    public class ExceptionThread implements Runnable {( t/ C/ m5 ]5 y0 \/ ~+ v
        public void run() {
    % {- V6 k' {( H        throw new RuntimeException("线程内部出现异常");
    $ f% X2 {1 Q; w! i5 K8 ~/ A
        }
      I4 T2 ^+ s, U  {8 ?& B* w, h: |# }
    3 N  l7 o  ]/ H9 T$ x2 m    public static void main(String[] args) {
    3 n( i' V! l. ~, ~/ C" S        try {0 Y% c$ s0 {9 V2 K/ M! j6 I
                ExecutorService exec = Executors.newCachedThreadPool();
    7 n' ?2 I# H, @% B1 q1 O1 R
                exec.execute(new ExceptionThread());
    * |1 N# o1 U8 u9 _- J4 X* v$ Y
            } catch (RuntimeException e) {
    % P8 v6 M$ n' z            System.out.println("能捕获到异常吗?");
    ( q) N/ C6 D+ ]. b8 w* A0 l
            }+ _: @8 o& s& _5 u. m
        }
    + ~7 w$ L! j  E& M  U. |/ M}
    # g% h/ ^- B# \5 h( ~, j; u3 j( I6 B- ~
    % Z2 V4 v  e' ]7 h/ z
    ) e+ M: [: ^- a# q( s+ Y3 I7 G运行结果呢?
    1 |, d6 ~  x/ [) DException in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常) o* D. T# E& }& i, _" V) _
            at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)  {* h, L* k. |0 I" @
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)7 ^9 r  M- L  h" y8 I2 ~
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    $ B0 z1 ^- k" B6 G9 \        at java.lang.Thread.run(Thread.java:748)
    & E# H) @6 `# o: ~3 K+ |2 b* m4 }& I  R) [+ L4 v4 O: X

    6 y( Z6 S* T6 `- j答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢  我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
    % j* u0 }! q3 A* t! f, h# y1、1 {8 e# z/ m3 j% \( w( l
    package com.javazx.test.thread;9 X$ x/ F+ \  n; z' Q( O

    0 U( k' m' u  u/ a% m% C
    public class ExceptionThread2 implements Runnable {& S! @: V0 b# D) K9 f' a* P2 L; Y
    5 W3 K- H& ^  G* |
        public void run() {
    ; S- X  d, y; b        throw new RuntimeException("抛出运行时异常");1 f: E1 t( M; Y% ?  u
        }& {* X' r1 p/ z: w
    }8 h0 o& `+ L. k& {" |: Q5 {
    , n7 q4 Z( d$ f
    2、+ R5 a' P; B! n
    package com.javazx.test.thread;$ e/ x& g6 r% g0 p$ Y

    2 ]6 d: U+ _1 T/ w
    public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {, p: Z) l# G2 P" I" @, `
        public void uncaughtException(Thread t, Throwable e) {
    * l- y4 A+ _9 v# q5 m        System.out.println("捕获到异常:" + e);; l2 H3 {9 k- f( {& A
        }! z% \. ?5 ^9 v
        public static void main(String [] args){
    : T# q  G3 a9 ]0 e1 s& r/ z! @& m        Thread t=new Thread(new ExceptionThread2());
    $ ~+ ?# F- U  K9 _
            t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
    ' n. J, N6 A! \% Z
            t.start();  o( k* {' \  P9 Q
        }
    ' x) o6 K8 a: n" P' o% @. Y}; {" u3 e# w/ i. o

    : V8 V! q1 |% y) O, w" ^, n7 y  v. K8 x( m% S6 w( V7 V

    ) x: b/ c' Z  N* I. [2 n/ r1 P. B运行结果:
    : w. Q, n6 z" a6 J8 v4 p* F捕获到异常:java.lang.RuntimeException: 抛出运行时异常
    1 m5 }2 p6 t/ Q  e. i' W5 C- D# L# H

    9 L: r( e0 K2 O3 a9 F4 H终于捕获到了异常,大功告成!3 X) f. \0 X! R. A: X1 h

    ; F1 ^' z# h% `$ @) g
    * f( j6 B; I7 l) g& Z+ E$ j7 s' r8 Z: a) C( {4 d
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-19 03:17 , Processed in 0.093705 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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