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

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

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

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

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

當(dāng)一個(gè)受檢異常在Thread對(duì)象的run()方法中被拋出時(shí),我們必須捕獲并處理它,因?yàn)閞un()方法不能拋出異常。而一個(gè)非受檢異常在Thread對(duì)象的run()方法中被拋出時(shí),默認(rèn)的行為是在控制臺(tái)打印出堆棧跟蹤信息然后退出程序。

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

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

知其然

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

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

復(fù)制代碼 代碼如下:

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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

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

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

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

知其所以然

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

復(fù)制代碼 代碼如下:

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

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

如果沒有設(shè)置處理類,Java虛擬機(jī)就會(huì)在控制臺(tái)將堆棧跟蹤信息打印出來,然后退出程序。

永無止境

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

當(dāng)線程中拋出一個(gè)未捕獲的異常時(shí),Java虛擬機(jī)會(huì)從三個(gè)地方尋找異常處理類:

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

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

拿來主義

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

小有所成

ExceptionHandler類的完整代碼

復(fù)制代碼 代碼如下:

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類的完整代碼

復(fù)制代碼 代碼如下:

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類的完整代碼

復(fù)制代碼 代碼如下:

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();
    }
}

相關(guān)文章

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

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

    這篇文章主要為大家介紹了MyBatis多對(duì)多關(guān)聯(lián)映射的創(chuàng)建示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    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?中新增的特性,也叫變長(zhǎng)參數(shù)或可變參數(shù),固定參數(shù)的概念恰好與可選參數(shù)相反,固定參數(shù)也就是普通的參,下文更多詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • 比較排序之冒泡排序的實(shí)現(xiàn)

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

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

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

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

    jedis的borrow行為方法源碼解讀

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

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

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

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

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

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

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

    JAVA“無法驗(yàn)證證書。將不執(zhí)行該應(yīng)用程序。”提示解決辦法

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

最新評(píng)論

深州市| 永胜县| 锡林郭勒盟| 高州市| 将乐县| 伽师县| 岫岩| 南川市| 许昌市| 安福县| 新安县| 吕梁市| 农安县| 霍城县| 通渭县| 全州县| 汉寿县| 沛县| 乳源| 孟州市| 五台县| 江达县| 建阳市| 昭通市| 双峰县| 环江| 龙州县| 亳州市| 通州区| 长葛市| 鲁甸县| 宁波市| 寻甸| 金门县| 大竹县| 库伦旗| 固镇县| 玛多县| 浙江省| 安远县| 四会市|