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

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)生非受檢異常的代碼,例如,將字符串轉換成數(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.運行示例,查看結果。

知其所以然

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

復制代碼 代碼如下:

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)設置過,則調用uncaughtException()方法,并將線程和異常作為參數(shù)傳遞給方法。

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

永無止境

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

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

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

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

拿來主義

本文是從 《Java 7 Concurrency Cookbook》 (D瓜哥竊譯為 《Java7并發(fā)示例集》 )翻譯而來,僅作為學習資料使用。沒有授權,不得用于任何商業(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();
    }
}

相關文章

  • java Tapestry4.1.2入門說明教程

    java Tapestry4.1.2入門說明教程

    不必關心鏈接!不必關心請求(http request)到了哪里!不必關心響應(http response)要轉向哪里!Tapestry構建于底層的request-resonse模式,基于Servlet技術,抽象出面向組件開發(fā)的模型。Tapestry關心的是:頁面、組件、事件、對象、方法、屬性!
    2008-11-11
  • 基于Luhn算法的銀行卡校驗規(guī)則

    基于Luhn算法的銀行卡校驗規(guī)則

    這篇文章主要為大家介紹了基于Luhn算法的銀行卡校驗規(guī)則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 使用try-with-resource的輸入輸出流自動關閉

    使用try-with-resource的輸入輸出流自動關閉

    這篇文章主要介紹了使用try-with-resource的輸入輸出流自動關閉方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring Data JPA帶條件分頁查詢實現(xiàn)原理

    Spring Data JPA帶條件分頁查詢實現(xiàn)原理

    這篇文章主要介紹了Spring Data JPA帶條件分頁查詢實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Kotlin 基礎教程之異常

    Kotlin 基礎教程之異常

    這篇文章主要介紹了Kotlin 基礎教程之異常的相關資料,需要的朋友可以參考下
    2017-06-06
  • Java反轉數(shù)組輸出實例代碼

    Java反轉數(shù)組輸出實例代碼

    這篇文章主要給大家介紹了關于Java反轉數(shù)組輸出以及利用Java實現(xiàn)字符串逆序輸出的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • springboot動態(tài)調用實現(xiàn)類方式

    springboot動態(tài)調用實現(xiàn)類方式

    這篇文章主要介紹了springboot動態(tài)調用實現(xiàn)類方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java中Map集合的常用方法總結大全

    java中Map集合的常用方法總結大全

    開發(fā)中最常用的就是List集合和Map集合,Map集合是基于java核心類java.util中的,下面這篇文章主要給大家總結介紹了關于java中Map集合的一些常用方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • Nacos?Client的Bug解決方法記錄

    Nacos?Client的Bug解決方法記錄

    這篇文章主要為大家介紹了Nacos?Client的Bug解決方法記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • java實現(xiàn)雙色球抽獎算法

    java實現(xiàn)雙色球抽獎算法

    這篇文章主要為大家詳細介紹了java實現(xiàn)雙色球抽獎算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論