最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)編程示例(八):處理線程的非受檢異常

 更新時間:2014年12月05日 11:03:36   投稿:junjie  
這篇文章主要介紹了Java并發(fā)編程示例(八):處理線程的非受檢異常,Java為我們提供了一種機制,專門用于處理由Thread對象拋出的非受檢異常,以避免程序的退出,需要的朋友可以參考下

Java語言中,把異常分為兩類:

受檢異常: 這類異常必須在throws子句中被顯式拋出或者在方法內(nèi)被捕獲。例如,IOException異?;駽lassNotFoundException異常。
非受檢異常: 這類異常不需要顯式拋出或捕獲。例如,NumberFormatException異常。

當一個受檢異常在Thread對象的run()方法中被拋出時,我們必須捕獲并處理它,因為run()方法不能拋出異常。而一個非受檢異常在Thread對象的run()方法中被拋出時,默認的行為是在控制臺打印出堆棧跟蹤信息然后退出程序。

幸運的是,Java為我們提供了一種機制,專門用于處理由Thread對象拋出的非受檢異常,以避免程序的退出。

在本節(jié),我們用示例來演示這種機制。

知其然

按照下面所示步驟來實現(xiàn)我們的示例。

1.首先,我們需要實現(xiàn)一個用于處理非受檢異常的類。這個類必須實現(xiàn)UncaughtExceptionHandler類,實現(xiàn)在該接口中聲明的uncaughtException()方法。在本例中,該類名為ExceptionHandler,uncaughtException()方法將異常以及拋出異常的線程信息打印出來。代碼如下:

復制代碼 代碼如下:

public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.printf("An exception has been captured\\n");
        System.out.printf("Thread: %s\n", t.getId());
        System.out.printf("Exception: %s: %s\n", e.getClass().getName(),
                e.getMessage());
        System.out.printf("Stack Trace: \n");
        e.printStackTrace(System.out);
        System.out.printf("Thread status: %s\n", t.getState());
    }
}

2.實現(xiàn)一個可以拋出非受檢異常的類,稱為Task,實現(xiàn)Runnable接口,實現(xiàn)run()方法,特意編碼一段可以產(chǎn)生非受檢異常的代碼,例如,將字符串轉(zhuǎn)換成數(shù)字。代碼如下:

復制代碼 代碼如下:

public class Task implements Runnable {
    @Override
    public void run() {
        int numero = Integer.parseInt("diguage.com");
    }
}

3.創(chuàng)建程序的主類,Main類,然后實現(xiàn)main()方法。代碼如下:

復制代碼 代碼如下:

public class Main {
    public static void main(String[] args) {

4.創(chuàng)建Task對象,并且創(chuàng)建一個Thread對象來執(zhí)行之。使用setUncaughtExceptionHandler() 方法設置非受檢異常的處理類。然后,啟動線程。代碼如下:
復制代碼 代碼如下:

Task task = new Task();
Thread thread = new Thread(task);
thread.setUncaughtExceptionHandler(new ExceptionHandler());
thread.start();

5.運行示例,查看結(jié)果。

知其所以然

從下面的輸出片段可以看出異常執(zhí)行的結(jié)果。異常被拋出,然后被處理類捕獲并將異常信息打印到了控制臺。

復制代碼 代碼如下:

An exception has been captured
Thread: 9
Exception: java.lang.NumberFormatException: For input string: "diguage.com"
Stack Trace:
java.lang.NumberFormatException: For input string: "diguage.com"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at com.diguage.books.concurrencycookbook.chapter1.recipe8.Task.run(Task.java:13)
    at java.lang.Thread.run(Thread.java:722)
Thread status: RUNNABLE

Process finished with exit code 0

當一個線程拋出一個異常,并且該異常(這里特指非受檢異常)沒有捕獲時,Java虛擬機會檢查是否通過相應方法設置非受檢異常處理類,如果以已經(jīng)設置過,則調(diào)用uncaughtException()方法,并將線程和異常作為參數(shù)傳遞給方法。

如果沒有設置處理類,Java虛擬機就會在控制臺將堆棧跟蹤信息打印出來,然后退出程序。

永無止境

Thread類還有一個和非受檢異常處理相關的方法。這就是靜態(tài)方法setDefaultUncaughtExceptionHandler(),該方法可以設置程序中所有線程的非受檢異常的處理類。

當線程中拋出一個未捕獲的異常時,Java虛擬機會從三個地方尋找異常處理類:

首先,從線程對象中查找異常處理類,這就是我們本節(jié)所學內(nèi)容。如不存在,則從線程所在的線程組(ThreadGroup)中查找異常處理類。關于這部分內(nèi)容,以后會專門講解。如果還是不存在,則查找上面剛剛提到的程序默認異常處理類。

如果上面提到的異常處理都不存在,則Java虛擬機將異常的堆棧跟蹤信息打印到控制臺,然后退出程序。

拿來主義

本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7并發(fā)示例集》 )翻譯而來,僅作為學習資料使用。沒有授權(quán),不得用于任何商業(yè)行為。

小有所成

ExceptionHandler類的完整代碼

復制代碼 代碼如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe8;

/**
 * 非受檢異常處理類
 * Date: 2013-09-22
 * Time: 23:11
 */
public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.printf("An exception has been captured\n");
        System.out.printf("Thread: %s\n", t.getId());
        System.out.printf("Exception: %s: %s\n", e.getClass().getName(),
                e.getMessage());
        System.out.printf("Stack Trace: \n");
        e.printStackTrace(System.out);
        System.out.printf("Thread status: %s\n", t.getState());
    }
}

Task類的完整代碼

復制代碼 代碼如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe8;

/**
 * 異常生成類
 * Date: 2013-09-22
 * Time: 23:18
 */
public class Task implements Runnable {
    @Override
    public void run() {
        int numero = Integer.parseInt("diguage.com");
    }
}

Main類的完整代碼

復制代碼 代碼如下:

package com.diguage.books.concurrencycookbook.chapter1.recipe8;

/**
 * 示例的主類
 * Date: 2013-09-22
 * Time: 23:20
 */
public class Main {
    public static void main(String[] args) {
        Task task = new Task();
        Thread thread = new Thread(task);
        thread.setUncaughtExceptionHandler(new ExceptionHandler());
        thread.start();
    }
}

相關文章

  • MyBatis多對多關聯(lián)映射創(chuàng)建示例

    MyBatis多對多關聯(lián)映射創(chuàng)建示例

    這篇文章主要為大家介紹了MyBatis多對多關聯(lián)映射的創(chuàng)建示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • WordPress中卸載插件以及移除文章類型組件的代碼示例

    WordPress中卸載插件以及移除文章類型組件的代碼示例

    這篇文章主要介紹了WordPress中卸載插件以及移除文章類型組件的代碼示例,包括卸載函數(shù)鉤子的方法介紹,需要的朋友可以參考下
    2015-12-12
  • Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù)

    Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù)

    這篇文章主要介紹了Java中方法優(yōu)先調(diào)用可選參數(shù)還是固定參數(shù),可選參數(shù)是?JDK?5?中新增的特性,也叫變長參數(shù)或可變參數(shù),固定參數(shù)的概念恰好與可選參數(shù)相反,固定參數(shù)也就是普通的參,下文更多詳細內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • 比較排序之冒泡排序的實現(xiàn)

    比較排序之冒泡排序的實現(xiàn)

    下面小編就為大家?guī)硪黄容^排序之冒泡排序的小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧實現(xiàn)。
    2017-06-06
  • MyBatis的模糊查詢mapper.xml的寫法講解

    MyBatis的模糊查詢mapper.xml的寫法講解

    這篇文章主要介紹了MyBatis的模糊查詢mapper.xml的寫法講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • jedis的borrow行為方法源碼解讀

    jedis的borrow行為方法源碼解讀

    這篇文章主要為大家介紹了jedis的borrow行為方法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 解讀JDK8踩坑JCE加密限制版本問題

    解讀JDK8踩坑JCE加密限制版本問題

    這篇文章主要介紹了JDK8踩坑JCE加密限制版本問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 淺析Java中接口和抽象類的七大區(qū)別

    淺析Java中接口和抽象類的七大區(qū)別

    Java 是一門面向?qū)ο蟮木幊陶Z言,面向?qū)ο蟮木幊陶Z言有四大特征:抽象、封裝、繼承和多態(tài)。本文介紹的接口和抽象類就是面向?qū)ο缶幊讨小俺橄蟆钡木唧w實現(xiàn)。本文也將為大家詳細講一下二者的區(qū)別,需要的可以參考一下
    2021-12-12
  • springboot整合ehcache 實現(xiàn)支付超時限制的方法

    springboot整合ehcache 實現(xiàn)支付超時限制的方法

    在線支付系統(tǒng)需要極高的穩(wěn)定性,在有限的系統(tǒng)資源下,穩(wěn)定性優(yōu)先級要高于系統(tǒng)并發(fā)以及用戶體驗,因此需要合理的控制用戶的支付請求。下面通過本文給大家介紹springboot整合ehcache 實現(xiàn)支付超時限制的方法,一起看看吧
    2018-01-01
  • JAVA“無法驗證證書。將不執(zhí)行該應用程序?!碧崾窘鉀Q辦法

    JAVA“無法驗證證書。將不執(zhí)行該應用程序?!碧崾窘鉀Q辦法

    這篇文章主要給大家介紹了關于JAVA“無法驗證證書,將不執(zhí)行該應用程序”提示的解決辦法,要解決Java無法驗證證書的問題,可以嘗試下本文的方法,需要的朋友可以參考下
    2024-03-03

最新評論

大悟县| 开化县| 佛学| 乌拉特中旗| 左权县| 南充市| 孟津县| 永靖县| 柘荣县| 安西县| 卢氏县| 吴旗县| 龙岩市| 云安县| 隆子县| 灯塔市| 西丰县| 桦川县| 广德县| 缙云县| 新津县| 从化市| 中江县| 上栗县| 桐庐县| 宿迁市| 当涂县| 拜泉县| 兰州市| 宁蒗| 怀安县| 航空| 堆龙德庆县| 安阳市| 乐平市| 伊宁市| 栾川县| 油尖旺区| 贡嘎县| 长兴县| 西安市|