/*
* 貌似有一篇文章寫到uncaugthException()方法,這個(gè)方法是線程組類的一個(gè)很重要的方法,它用來處理線程未處理的異常。
* 其實(shí),線程捕獲異常的方式是這樣的,如果線程沒有捕獲異常,那么java虛擬機(jī)會找到相關(guān)的UncaughtExceptionHandler實(shí)例化對象,如果
* 找到了就調(diào)用uncaughtException(Thread t, Throwable e)方法,如果找不到呢,就調(diào)用線程組的異常處理器,調(diào)用線程組的
* uncaughtException方法,因?yàn)槊總€(gè)線程都屬于一個(gè)線程組,而這個(gè)線程組繼承了UncaughtExceptionHandler這個(gè)接口,所以,線程組也可以
* 用來處理線程未捕獲的異常。另一點(diǎn)需要說的是,線程本身就有兩個(gè)個(gè)設(shè)置未捕獲異常的使用方法:setDefaultUncaughtExceptionHandler和
* setUncaughtExceptionHandler方法,從字面上來理解,就是未捕獲異常處理機(jī)制,線程可以設(shè)置自己的未捕獲異常處理方式,前者是默認(rèn)處理,表示
* 類的默認(rèn)異常處理,這是一種靜態(tài)方法,而后者是一種實(shí)例方法,它表示的是設(shè)置當(dāng)前的異常處理方式。
*
*/
package com.cbh.thread_test;
*@author cbh–java編程網(wǎng),http://www.haohaoblog.com
class MyGod extends ThreadGroup//線程組
{
public MyGod()
{
super(“I’m God!”);
}
public void uncaughtException(Thread t,Throwable e)//覆蓋線程組的異常處理器方法
{
System.out.println(getName()+”抓到異常了,它來自線程:”+t.getName());
super.uncaughtException(t, e);//使用父類的異常處理器
}
}
class GodCaught implements Thread.UncaughtExceptionHandler
{//線程的未捕獲的異常處理方式
private String name;
public GodCaught(String name)
{
this.name=name;
}
public void uncaughtException(Thread t, Throwable e) {//線程異常處理器方法
System.out.println(name+”抓到異常,它從線程:”+t.getName()+”來”);
}
}
public class Thread_uncaughtException extends Thread{
public Thread_uncaughtException(ThreadGroup group,String name)
{
super(group,name);
}
public void run()
{
int i=100/0+1;//線程拋出異常的地方
}
public static void main(String[] args) {
MyGod mg=new MyGod();
UncaughtExceptionHandler ueh=new GodCaught(“默認(rèn)未捕捉線程異常處理”);
//設(shè)置異常處理方式,為默認(rèn)方式,即設(shè)置類的異常處理器。
Thread_uncaughtException.setDefaultUncaughtExceptionHandler(ueh);
Thread_uncaughtException tue1=new Thread_uncaughtException(mg,”tue1″);
Thread_uncaughtException tue2=new Thread_uncaughtException(mg,”tue2″);
UncaughtExceptionHandler cur=new GodCaught(“設(shè)置未捕捉線程異常處理”);
tue2.setUncaughtExceptionHandler(cur);//設(shè)置當(dāng)前的異常處理器
tue1.start();
tue2.start();
}
}
/**
* 整個(gè)的過程是這樣的:當(dāng)一個(gè)線程實(shí)例拋出未捕獲的異常時(shí),java虛擬機(jī)首先找到線程實(shí)例的當(dāng)前異常處理器,調(diào)用uncaughtException()方法,如果找不到,就
* 找線程所屬的線程組作為異常處理器,調(diào)用它的uncaughtException()方法,如果這個(gè)線程組有一個(gè)父類線程組,那么就調(diào)用uncaughtException方法,否則,如果
* 線程實(shí)例所屬的線程類具有默認(rèn)異常處理器,就調(diào)用這個(gè)默認(rèn)異常處理器的uncaughtException方法,否則,就把來自方法調(diào)用堆棧的異常信息打印到標(biāo)準(zhǔn)輸出流System.err中
* 當(dāng)tue2拋出異常時(shí),直接用當(dāng)前處理器cur,對于tue1拋出的異常,由于沒有設(shè)置當(dāng)前處理器,所以有所屬線程組作為異常處理器,處理完后再轉(zhuǎn)讓給所屬類Thread_uncaughtException的默認(rèn)異常處理器
* ueh進(jìn)行處理。
*/
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。