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 还依然管用吗?让我们一起先看个小例子吧。
    : J% W6 }/ C. G8 }" d/ [- |package com.javazx.test.thread;3 w5 |* [6 S" a( v' z

    % j0 B; l6 |0 Y/ V% k
    import java.util.concurrent.ExecutorService;
    3 B: ]2 t& {; x9 J, ]- Z
    import java.util.concurrent.Executors;
    6 L4 w- P% k) f5 ^& S

    ( s) n0 ?( o% |6 L/ ~$ \
    public class ExceptionThread implements Runnable {7 |: ~6 W3 x2 D2 m, J! e; m
        public void run() {+ L0 k: V/ _  n  E% I* s2 {
            throw new RuntimeException("线程内部出现异常");
    * l3 @( N) i' R  L9 p. h" S
        }
    & G' k6 F! L/ N0 r! |1 x5 I
    - p! W0 J& M1 C& F    public static void main(String[] args) {( e" ~% Q) ^) |% F% h* f
            try {0 n( R9 V+ V( q% j; @
                ExecutorService exec = Executors.newCachedThreadPool();2 u' T8 A( d1 Q5 q4 K8 H! ]! V* A
                exec.execute(new ExceptionThread());
    / q) U$ ~4 p# A8 P5 j' ]5 q
            } catch (RuntimeException e) {
    + G* p" ~6 j' [9 J# ?1 D            System.out.println("能捕获到异常吗?");( X& P1 c5 x; T  P6 E
            }
    + [/ ]. s( C7 N! {6 `$ e    }1 N9 H8 T$ K% p
    }0 n+ ?9 H3 Q; U" Y; i: f

    5 D0 @- d' Q0 {9 u) ^( W8 k  s, `7 z3 C
    运行结果呢?6 D$ H+ C: d2 p; V5 G' ?/ p
    Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常: g" d2 h5 Y8 b
            at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)) F% p8 |% I& J
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    6 D, E& x4 p8 ?; H        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    4 z6 ?+ W$ t0 Z# y. J# Z- b        at java.lang.Thread.run(Thread.java:748)
    $ X4 U1 J/ p* o  A+ W6 R9 g5 b! K4 C" Z$ r' k
    & W4 S8 F; t" y4 w8 [( d
    答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢  我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。- m/ X$ O: [4 g0 Q6 b# {
    1、& i2 \( d8 L8 c' L) s
    package com.javazx.test.thread;
    % W7 T' n) l: L' f
    . w" b1 H3 j5 F: ]5 c, U5 ^
    public class ExceptionThread2 implements Runnable {
    & L: ]. R  V# v( U4 ?" m' L* ^/ Z- K6 [
        public void run() {
    6 N( k/ K- t8 B# K) {& ^3 a2 C        throw new RuntimeException("抛出运行时异常");
    * r: E8 D. ]2 k' N/ X
        }; v$ D3 B9 K  z# P  @, _3 K
    }+ R7 D5 }$ E& n5 c9 b
    * }! q, f4 U- V% x0 S# V
    2、* h' `+ b! [( ?  h3 P
    package com.javazx.test.thread;3 g4 }! O6 u% J1 e: F
    8 k* w  i1 {5 I
    public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {& r9 [9 a3 C! r9 h( o0 S% `
        public void uncaughtException(Thread t, Throwable e) {4 B  c. J: A1 T3 h
            System.out.println("捕获到异常:" + e);
    9 k/ H, Q: P7 I6 g9 P" R
        }  x/ |7 p- t0 A# K
        public static void main(String [] args){
    ' I4 ^3 U  i! k" p) y7 k0 e        Thread t=new Thread(new ExceptionThread2());
    1 ^. `8 V6 ^1 q: M& {
            t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());* _  n% Z: \4 B4 B5 X+ w0 ~
            t.start();& N3 D4 r! ?* l+ u# J- |  J
        }5 M3 G7 z3 L1 R% B; H( i; X4 t% e5 f. D
    }* _; u& m9 b8 R% J8 l- z2 a. z
    * l0 i5 k% _( d8 N; |
    , x6 \" E- ?: [
    ' r" b) i3 p( f( ?9 j( v4 t$ j) _
    运行结果:
    ; b: O* M( ~6 o* Q+ R  [; R7 y4 y捕获到异常:java.lang.RuntimeException: 抛出运行时异常
    + s) p- u* a! L+ ]( \) D' Z4 o" H* W& S* V3 y2 g$ w
    # \% K1 B5 C& i0 x$ v% m0 z
    终于捕获到了异常,大功告成!% _- ~9 m; _. q# s* T$ y
    ; `8 ?7 U; r! Q$ H" @
    + N/ }+ M$ A' L0 m; r
    0 q' S7 Z" H2 i2 V  e( b* X; m6 Z. t
    回复

    使用道具 举报

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

    本版积分规则

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

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

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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