java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2832|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66101

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

    发表于 2017-11-3 15:42:36 | 显示全部楼层 |阅读模式
    大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。! w9 r- n1 c) [
    package com.javazx.test.thread;! ?7 s. U3 d" s/ w  Y" o. X  y
    ) _0 c' B2 u$ x1 p4 ^9 H& E- }! i
    import java.util.concurrent.ExecutorService;3 q! U1 N5 I& R0 h2 Y$ G
    import java.util.concurrent.Executors;, Z5 e' P2 x4 v7 ~$ S

    0 V) W" v7 e! I# a5 H1 B) m: T
    public class ExceptionThread implements Runnable {: d6 A6 a  A$ M: G* o
        public void run() {6 Z, z5 y, s7 X
            throw new RuntimeException("线程内部出现异常");6 `" T% l5 y: N5 V" N
        }
    , a/ Z' B& L; F! G3 t. Z: i! u: O8 ?4 d2 b: H) I
        public static void main(String[] args) {5 S" U% S, K( f- C) f: D: Z
            try {  ]$ W# {9 n8 {) M3 z7 r2 j: ]
                ExecutorService exec = Executors.newCachedThreadPool();4 t! a% {  j: M3 t5 s
                exec.execute(new ExceptionThread());
    * c9 d% d1 {" @8 K- [! O
            } catch (RuntimeException e) {  Y6 V# l5 r6 ^8 ?8 e' {
                System.out.println("能捕获到异常吗?");1 \' ~1 M) ?# O# A
            }7 M0 B7 y* M* o% m% t
        }3 L0 R; L& \" s1 u
    }( Z) m3 i8 ]! r; V9 D4 Z
    4 \5 L; F4 {% n8 R$ I6 i& t, |( C

    3 I" ^3 F& i) `运行结果呢?4 u4 ~" f, m- q" D
    Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常9 C: B& i; g# B6 e- n* |
            at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)
    7 _; [3 @0 Q  O6 v- \! \        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    1 h! o6 W" B; a        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    " B* M3 |; B7 y' [& [        at java.lang.Thread.run(Thread.java:748)6 ?6 R& q& {/ J2 s
    1 ?3 E% _+ K/ L

    8 h- m8 }  p. `) f6 X3 e答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢  我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
    & q& K) X5 [5 v% X( G1、% i3 r2 Y; [* K( X- ~6 l
    package com.javazx.test.thread;( L8 b+ a) g4 ]9 o% U; W  Q0 r

    + s; u; c( T  g1 [, s: L+ A
    public class ExceptionThread2 implements Runnable {
    " m' I4 z- ~) i5 k; [" ~
    ) ]3 t) Q) l' F. Q. q* ?1 g+ V, i    public void run() {
    . L8 `! e  n+ y$ B1 F        throw new RuntimeException("抛出运行时异常");
    ( w7 `  S: v& Z$ U8 V6 O& R
        }
    4 a$ x& g3 q" u- ]$ D" H1 F6 n0 l}
    9 h& L0 a+ c5 D0 w5 e- \
    7 X% r1 F3 s1 ~2、
    % x( }* |. M, h2 s$ gpackage com.javazx.test.thread;
    ' }) d& B" ~# D' b: a  `4 C' g
    4 z& y/ b7 {( w/ p# G
    public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {' H/ S; l7 Z. }) e! o2 a# M0 w( r! ~
        public void uncaughtException(Thread t, Throwable e) {# \+ A- Z0 o! t' _" w1 h3 E
            System.out.println("捕获到异常:" + e);
    : R* ?- a+ Y+ ~8 }. n- z6 O
        }- {; y. y0 I. h- s1 U
        public static void main(String [] args){
    " B. A( r% i# r. l        Thread t=new Thread(new ExceptionThread2());
    + F, J( @) ?. w) Y/ P
            t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
    ' r8 a& J1 P, i: }
            t.start();
    8 w  b* m0 f+ X* w' q/ V& b
        }0 V3 W" j  W8 w
    }
    , {( D! Q( V( u0 ?. c
    : j3 e* X( r  X$ I# X% R1 R  s) I

    ' T8 g( h2 v' @# w3 G5 n' M运行结果:+ _/ F4 @% e. R0 p5 f" q
    捕获到异常:java.lang.RuntimeException: 抛出运行时异常
    2 G" \; u8 ^& T+ T4 Z0 a
    4 A  u* F& r0 `
    ( C# T5 U% @, f' c; O8 B( h: h) L
    终于捕获到了异常,大功告成!
    & ?9 f6 w5 n' `' w
    ( ]7 _  n7 R. B4 m5 e
    ' k5 h$ |3 [' [
    $ U" L) [( c6 e* g$ \
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-4 11:11 , Processed in 0.092791 second(s), 31 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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