java自学网VIP

Java自学网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2810|回复: 0

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

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

    [LV.Master]出神入化

    2025

    主题

    3683

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    66083

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

    发表于 2017-11-3 15:42:36 | 显示全部楼层 |阅读模式
    大家都知道在java开发中,我们可以用try catch来捕获异常,那么线程中出现了异常try catch 还依然管用吗?让我们一起先看个小例子吧。1 l3 L$ S. K+ |* o, S3 x% t5 e
    package com.javazx.test.thread;
    4 @. U1 I% z- A
    2 V; N( J0 v2 q. |
    import java.util.concurrent.ExecutorService;
    % Z" Z0 q7 n+ f% ^$ }+ l& |$ E  W
    import java.util.concurrent.Executors;
    # M$ {* B' e1 I: R1 E

    . W( E1 i& w+ D; r
    public class ExceptionThread implements Runnable {
    . F3 v6 p" K6 m) \/ {    public void run() {7 O9 C( f# }- ], f! ^$ b. H
            throw new RuntimeException("线程内部出现异常");
    ! H% H" k9 S$ }* x: Y4 R- `
        }
    , {# y7 }" g3 K5 ~2 @+ z/ Q$ |6 v! X3 J2 D, {
        public static void main(String[] args) {
    * n5 a+ i1 _( f- L( S( d+ q2 B; R        try {5 E: J8 P3 A3 `" y  L( g
                ExecutorService exec = Executors.newCachedThreadPool();8 k# p7 E, i8 e
                exec.execute(new ExceptionThread());
    : O. ]1 x7 ]$ L( \6 R2 K
            } catch (RuntimeException e) {
    0 g3 v7 B, }. h7 T2 {6 ?' h            System.out.println("能捕获到异常吗?");
    , E- Y2 y2 T! ~* p# z: l; N* k
            }
    ( l: ^0 ]7 g* f    }
    ' [# L$ j% R. E- y- K! ^, h0 ~}) Q) b! E$ d4 S5 t/ I

    4 u2 e4 S3 E: G, I! u, U9 E* A1 L1 M. {& ^9 G- c
    运行结果呢?; X8 K$ ]" E& o) r& ]
    Exception in thread "pool-1-thread-1" java.lang.RuntimeException: 线程内部出现异常
    3 a" g1 q2 V! u4 [        at com.javazx.test.thread.ExceptionThread.run(ExceptionThread.java:8)" s$ K2 }9 Y% A3 j
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)! i/ K  O8 l2 |8 ~
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    ( V0 b% C' u+ V9 x! c        at java.lang.Thread.run(Thread.java:748)
    4 Y" Y& J! |& g1 _9 I( v. T$ b
    ) C# e9 \& I) T$ m% u6 J  f3 D: u7 _. G
    答案已经很明显了,线程中是无法使用try catch来进行捕获的。那么如果要捕获异常呢  我们该怎么做呢?javase 1.5后我们是可以用UncaughtExceptionHandler来捕获异常的,具体要怎么做呢?大家还是看demo吧。
    0 m, j9 h/ F+ r6 i7 o  w5 a1、6 o) O* ?; u* H
    package com.javazx.test.thread;5 ?* w% T& R3 ?# w
    $ b9 o) A  l" W2 l" q6 P8 s5 Z( W
    public class ExceptionThread2 implements Runnable {
    " K' C0 `6 g' x1 s" ^% Q6 d0 h9 I- F* I1 U2 G
        public void run() {
    * _, P' }, a3 ]        throw new RuntimeException("抛出运行时异常");5 B6 p) S% x; r* @5 b+ w) O5 ^
        }8 x0 W) j8 K& j
    }9 v# M2 y" _0 B) T

    3 Z* T9 H% y6 Z6 ^# P2、, b2 O; Y' b0 y3 B# r+ s& i
    package com.javazx.test.thread;
    ) H, d! K) ?7 e! u3 _: `) W

    . d: d$ r; w! y" F( c
    public class MyUnchecckedExceptionhandler implements Thread.UncaughtExceptionHandler {
    " k6 m4 |, {$ D    public void uncaughtException(Thread t, Throwable e) {) d: m+ s" Y4 V: X
            System.out.println("捕获到异常:" + e);
    % K) B9 G# O$ [- `4 X2 o
        }$ I4 w& s7 o8 O1 D+ T$ m4 R
        public static void main(String [] args){1 Z# V# `' {$ S( M5 G$ B0 X
            Thread t=new Thread(new ExceptionThread2());* \% P" @8 A( ]/ l9 W( |' R
            t.setUncaughtExceptionHandler(new MyUnchecckedExceptionhandler());
    0 e  L, s4 M8 v" I
            t.start();
    * \  d3 I2 ~' r6 U) o
        }
    ) `6 _- a5 o* `$ T8 A1 [}
    * K; P  F+ N$ S5 Q" k& {0 I7 z( Q$ w! M

    8 ~$ L. j' b2 j1 @  t8 E7 w5 ^

    6 ^& D* @& s) t! \0 g* w运行结果:! A. C& m3 w) G* w+ z
    捕获到异常:java.lang.RuntimeException: 抛出运行时异常
    6 K* Q4 K; s3 H: B8 ^, W( |
    * N1 E- n( Y4 L; }1 n

    2 U& N/ ]! k. G( F1 l/ N4 U7 k终于捕获到了异常,大功告成!; U! [  }+ X3 q( Y1 G

    2 L/ \" J& y6 z+ K9 o  f
    0 ?: l; O. m& F" G+ K% I
      [* D" Q5 ]4 o! J4 f  Q
    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-20 03:09 , Processed in 0.059527 second(s), 29 queries .

    Powered by Javazx

    Copyright © 2012-2022, Javazx Cloud.

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