java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3166|回复: 0

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

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

    [LV.Master]出神入化

    2062

    主题

    3720

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66592

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

    发表于 2017-11-3 15:42:36 | 显示全部楼层 |阅读模式
    大家都知道在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 N
    import java.util.concurrent.ExecutorService;
    / e3 b- X# ^8 I7 J# q1 c* z# S
    import java.util.concurrent.Executors;
    " W& ~- _  [: [  L) ]

    1 B: r1 i* H: g( W
    public 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
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-23 12:49 , Processed in 0.310475 second(s), 33 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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