首页 > 其他分享 >main线程执行 int a=10/0; 是怎么捕获异常的

main线程执行 int a=10/0; 是怎么捕获异常的

时间:2022-10-31 18:45:21浏览次数:71  
标签:10 Thread int void System UncaughtExceptionHandler uncaughtException main

首先看一个例子

int a=10/0;

控制台输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
	at threadpool.ThreadPoolTest.main(ThreadPoolTest.java:56)

 public static void main(String[] args) {
        Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("["+t.getName()+"\t" +e.getMessage()+"]");
                System.out.println("被除数不能为零");
            }
        });
        int a=10/0;
    }

输出结果

[main	/ by zero]
被除数不能为零

为什么这样会改变输出结果呢?因为在不做异常捕获时JVM会自动捕获异常

    /**
     * Dispatch an uncaught exception to the handler. This method is
     * intended to be called only by the JVM.
     * 将未捕获的异常分派给处理程序。此方法旨在仅由 JVM 调用
     */
    private void dispatchUncaughtException(Throwable e) {
        getUncaughtExceptionHandler().uncaughtException(this, e);
    }

getUncaughtExceptionHandler()方法先会去判断uncaughtExceptionHandler 是否为null ,如果是的就会用ThreadGroup group 这个对象

    public UncaughtExceptionHandler getUncaughtExceptionHandler() {
        return uncaughtExceptionHandler != null ?
            uncaughtExceptionHandler : group;
    }

ThreadGroup uncaughtException()方法

    public void uncaughtException(Thread t, Throwable e) {
        if (parent != null) {
            parent.uncaughtException(t, e);
        } else {
           //看一当前线程下是否设置了默认的UncaughtExceptionHandler
            Thread.UncaughtExceptionHandler ueh =
                Thread.getDefaultUncaughtExceptionHandler();
            if (ueh != null) {
                //如果有就用设置的UncaughtExceptionHandler
                ueh.uncaughtException(t, e);
            } else if (!(e instanceof ThreadDeath)) {
               //没有就用这个
                System.err.print("Exception in thread \""
                                 + t.getName() + "\" ");
                e.printStackTrace(System.err);
            }
        }
    }

在上面的代码中,在当前线程中设置了UncaughtExceptionHandler(函数式接口),所以会用设置异常处理器。
除了上述方式还可以用下面这种方式来设置

        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println(111);
            }
        });

如果两种都设置了就会用第一种方式,因为getUncaughtExceptionHandler()会优先使用第一种方式。

标签:10,Thread,int,void,System,UncaughtExceptionHandler,uncaughtException,main
From: https://www.cnblogs.com/lyuSky/p/16845297.html

相关文章

  • 10月29号 CSP-S 赛后有感)
     //第一次写博客,可能不是很好,后续比赛的失误也将写入其中,当然首先说明原因,写博客是因为教练的要求qwq 这次的比赛我考的不是很理想,原因如下(望后人引以为戒):......
  • 10月31日
    目录要求博客中用文字描述出每个功能的逻辑三层框架简介1、第一层(src.py)2、第二层(interface文件夹下内容)3、第三层(db_hanlder)启动函数用户注册功能用户登录查看余额账户......
  • 51Nod-1003-阶乘后面0的数量
    这道题网上已经有很多博客了,但是都没讲清楚,想明白后遂做此记录。阶乘后面0的数量,乘起来是以0结尾,只能是​​2x5​​​,说0结尾的走开。而2的数量肯定比5多不,所以只要计算5......
  • 分布式系统快速接入pinpoint1.8.3指南
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos关于pinpointpinpoint是一款调用链跟踪工具,目前最新版是1.8.5,......
  • 使用int128记录大整数
    部分编译器支持128bit的整数表示,但是需要手写输入输出。注意:__int128等价于__int128_t,不存在int128和int128_t。输出函数:voidPrint128(__int128num){if(num<0......
  • 2022.10.21----vscode-自定义事件
     vscode预览模式关闭,就能打开新标签页(43条消息)vscode新窗口打开文件-CSDN (43条消息)如何在vscode中打开新文件夹不覆盖上一个窗口标签_发呆的薇薇°的博客-......
  • windows10卸载vmware workstation
    在应用与功能里面,vmware的卸载选项是禁用的,而点击修改,却也弹出了报错,似乎无法直接卸载。网上大多说需要下载一个WindowsInstallerCleanUP之类的软件,但又对那种未知来源的......
  • STMicroelectronics STM32F103C8
    STMicroelectronics STM32F103C8ARMCortex-M3,72MHz,64kBROM,20kBRAMSTMicroelectronics'STM32F1seriesofmainstreamMCUscoverstheneedsofalar......
  • 处理敏感字、js 正则过滤敏感词mint-filter
    如何使用js过滤敏感词在字符串中有敏感字就打几个*号来代替vars="夜黑风高夜,在小树林我里个去,你大爷的";varreg=/我里个去|你大爷的/g;s=s.replace(r......
  • 2022-10-31 删除无法删除的文件夹or文件
    新建.txt文件,复制下面代码:DEL/F/A/Q\\?\%1RD/S/Q\\?\%1把.txt文件改名为.bat,保存。拖动该文件到你想要的文件夹or文件上面,松开鼠标。然后再删除。我试了,没用!......