欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java異常處理UncaughtExceptionHandler使用實例代碼詳解

 更新時間:2023年03月01日 09:38:18   作者:健鑫.  
當一個線程由于未捕獲異常即將終止時,Java虛擬機將使用thread . getuncaughtexceptionhandler()查詢線程的uncaughtException處理程序,并調用處理程序的uncaughtException方法,將線程和異常作為參數(shù)傳遞

異常處理

線程未捕獲異常 UncaughtException 需要UncaughtZExceptionHandler 來進行處理

那么為什么非要用UncaughtZExceptionHandler呢?

  • 主線程可以輕松捕獲線程,子線程不可以
  • 從下面代碼可知,即使子線程拋出異常,主線程絲毫不受影響
public class ChildException implements Runnable{
    public static void main(String[] args) {
        new Thread(new ChildException()).start();
        for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }
    }
    @Override
    public void run() {
        throw new RuntimeException();
    }
}
/*
* Exception in thread "Thread-0" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.ChildException.run(ChildException.java:14)
   at java.lang.Thread.run(Thread.java:748)
0
1
2
3
4
5
6
7
8
9
* */
  • 從下面代碼可知,即使想用catch捕獲子線程異常,時沒有用的
  • try catch 是針對主線程的,沒有辦法捕獲子線程的異常
public class CantCatch implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        try {
            new Thread(new CantCatch(), "thread0").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread1").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread2").start();
            Thread.sleep(300);
            new Thread(new CantCatch(), "thread3").start();
            Thread.sleep(300);
        } catch (RuntimeException e) {
            System.out.println("catch");
        }
    }
    @Override
    public void run() {
        throw new RuntimeException();
    }
}
/*
* Exception in thread "thread0" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread1" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread2" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Exception in thread "thread3" java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.CantCatch.run(CantCatch.java:22)
   at java.lang.Thread.run(Thread.java:748)
Process finished with exit code 0
* */

在run方法中進行try catch可以捕獲到異常,但是特別麻煩,因為需要手動地在每個run方法中都進行try catch

UncaughtExceptionHandler

自定義UncaughtExceptionHandler

public class MyUncaughtHandler implements Thread.UncaughtExceptionHandler{
    private String name;
    public MyUncaughtHandler(String name) {
        this.name = name;
    }
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        Logger logger = Logger.getAnonymousLogger();
        logger.log(Level.WARNING, "線程異常" + t.getName(), e);
        System.out.println(name + "捕獲" + t.getName()+ e);
    }
}

使用自定義的類來捕獲異常

public class UseOwnExceptionHandler implements Runnable {
    public static void main(String[] args) throws InterruptedException {
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtHandler("MyHandler"));
//        try {
        new Thread(new UseOwnExceptionHandler(), "thread0").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread1").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread2").start();
        Thread.sleep(300);
        new Thread(new UseOwnExceptionHandler(), "thread3").start();
        Thread.sleep(300);
//        } catch (RuntimeException e) {
//            System.out.println("catch");
//        }
    }
    @Override
    public void run() {
//        try {
        throw new RuntimeException();
//        } catch (RuntimeException e) {
//            System.out.println("e");
//        }
    }
}
/*
* 一月 29, 2023 11:22:01 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 線程異常thread0
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕獲thread0java.lang.RuntimeException
一月 29, 2023 11:22:01 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 線程異常thread1
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕獲thread1java.lang.RuntimeException
一月 29, 2023 11:22:02 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 線程異常thread2
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕獲thread2java.lang.RuntimeException
一月 29, 2023 11:22:02 上午 com.jx.JavaTest.Thread.Exception.MyUncaughtHandler uncaughtException
警告: 線程異常thread3
java.lang.RuntimeException
   at com.jx.JavaTest.Thread.Exception.UseOwnExceptionHandler.run(UseOwnExceptionHandler.java:24)
   at java.lang.Thread.run(Thread.java:748)
MyHandler捕獲thread3java.lang.RuntimeException
Process finished with exit code 0
* */

到此這篇關于Java異常處理UncaughtExceptionHandler使用實例代碼詳解的文章就介紹到這了,更多相關Java UncaughtExceptionHandler內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java開發(fā)使用StringUtils.split避坑詳解

    java開發(fā)使用StringUtils.split避坑詳解

    這篇文章主要為大家介紹了java開發(fā)使用StringUtils.split避坑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • java中將一個List等分成n個list的工具方法(推薦)

    java中將一個List等分成n個list的工具方法(推薦)

    下面小編就為大家?guī)硪黄猨ava中將一個List等分成n個list的工具方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java數(shù)據(jù)結構之鏈表相關知識總結

    Java數(shù)據(jù)結構之鏈表相關知識總結

    今天給大家?guī)黻P于Java數(shù)據(jù)結構的相關知識,文章圍繞Java鏈表展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 常用數(shù)字簽名算法RSA與DSA的Java程序內實現(xiàn)示例

    常用數(shù)字簽名算法RSA與DSA的Java程序內實現(xiàn)示例

    這篇文章主要介紹了常用數(shù)字簽名算法RSA與DSA的Java程序內實現(xiàn)示例,一般來說DSA算法用于簽名的效率會比RSA要快,需要的朋友可以參考下
    2016-04-04
  • java控制臺實現(xiàn)學生信息管理系統(tǒng)(集合版)

    java控制臺實現(xiàn)學生信息管理系統(tǒng)(集合版)

    這篇文章主要為大家詳細介紹了java控制臺實現(xiàn)學生信息管理系統(tǒng)的集合版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java 非阻塞I/O使用方法

    Java 非阻塞I/O使用方法

    這篇文章主要介紹了Java 非阻塞I/O使用方法,文中涉及非阻塞I/O的簡介,同時向大家展示了利用非阻塞I/O實現(xiàn)客戶端的方法,需要的朋友可以參考下。
    2017-09-09
  • springboot驗證碼生成以及驗證功能舉例詳解

    springboot驗證碼生成以及驗證功能舉例詳解

    登錄注冊是大部分系統(tǒng)需要實現(xiàn)的基本功能,同時也會對登錄驗證增加需求,下面這篇文章主要給大家介紹了關于springboot驗證碼生成以及驗證功能的相關資料,需要的朋友可以參考下
    2023-04-04
  • java8 多個list對象用lambda求差集操作

    java8 多個list對象用lambda求差集操作

    這篇文章主要介紹了java8 多個list對象用lambda求差集操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java實現(xiàn)LRU緩存淘汰算法的方法

    java實現(xiàn)LRU緩存淘汰算法的方法

    LRU(Least recently used,最近最少使用)算法根據(jù)數(shù)據(jù)的歷史訪問記錄來進行淘汰數(shù)據(jù),其核心思想是“如果數(shù)據(jù)最近被訪問過,那么將來被訪問的幾率也更高”。下面看下java實現(xiàn)LRU緩存淘汰算法的方法,一起看看吧
    2021-11-11
  • 詳解SpringCloud Config配置中心

    詳解SpringCloud Config配置中心

    這篇文章主要介紹了詳解SpringCloud Config配置中心,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03

最新評論