每個(gè)Java程序員都要處理異常,異常處理在應(yīng)用程序中起著重要的作用。在Java世界中,處理異常看上去不是那么簡(jiǎn)單,不僅僅是在異常發(fā)生的地方,優(yōu)雅的報(bào)告異常。
使用ThreadGroup處理異常
ThreadGroup類中在這個(gè)時(shí)候大部分方法已經(jīng)作廢了,但是該類還是很有用的。ThreadGroup類有一個(gè)方法uncaughtException(Thread,Throwable),意思是:當(dāng)線程組中的線程因?yàn)楫惓6K止時(shí),Java虛擬機(jī)調(diào)用該方法。這樣你可以考慮繼承ThreadGroup類來處理你應(yīng)用中沒有捕獲的異常。
public class AppSpecificThreadGroup extends ThreadGroup {
public void uncaughtException(Thread, Throwable) {
// app specific error handling here
// ex: if fatal, release resources
// show user dialog
}
}
這樣在你的應(yīng)用啟動(dòng)的時(shí)候,把你的線程加入到線程組(Thread group)中。
public class ApplicationMain {
public static void main(String[] args) {
Runnable r = new ApplicationStarter(args);
ThreadGroup g = new AppSpecificThreadGroup();
Thread t = new Thread(g, r);
t.start();
}
private static void doStart(String[] args) {
// start application here...
}
private static class ApplicationStarter {
private String[] args;
ApplicationStarter(String[] args) {
this.args = args;
}
public void run() {
doStart(args);
}
}
}
使用Java5的Thread.UncaughtExceptionHandler
當(dāng)認(rèn)識(shí)到ThreadGroup.uncaughtException(Thread,Throwable)方法的巨大作用時(shí),Sun團(tuán)隊(duì)在Java5版本站中增強(qiáng)了未捕獲的異常處理的功能,引入了Thread.UncaughtExceptionHandler接口,另外這個(gè)接口引入了兩個(gè)新的”Check points”用于處理異常。Thread類有兩個(gè)屬性-uncaughtExceptionHandler和defaultUncaughtExceptionHandler,它們有相應(yīng)的get/set方法。但是這兩個(gè)方法是不同的。讓我們看看處理異常的過程。
n 使用uncaughtExceptionHandler為當(dāng)前線程處理異常。
n 如果uncaughtExceptionHandler為空(null),使用線程組(如果用戶沒有顯示設(shè)置,線程組是uncaughtExceptionHandler的默認(rèn)實(shí)現(xiàn))。
n 如果線程組是默認(rèn)的實(shí)現(xiàn),但是不是根線程組,將把錯(cuò)誤處理委派給父線程組。
n 如果線程組是默認(rèn)的實(shí)現(xiàn),并且是根線程組,將使用線程(Thread)類上設(shè)置的defaultUncaughtExceptionHandler方法。
n 如果在線程類沒有設(shè)置defaultUncaughtExceptionHandler,將調(diào)用Java5之前的ThreadGroup類中的未捕獲異常方法。
實(shí)現(xiàn)Thread.UncaughtExceptionHandler接口看起來也像上面實(shí)現(xiàn)ThreadGroup接口。
public class AppSpecificExceptionHandler implements Thread.UncaughtExceptionHandler {
public void uncaughtException(Thread, Throwable) {
// app specific error handling here
// ex: if fatal, release resources
// show user dialog
}
}
在應(yīng)用程序中插入如下:
public class ApplicationMain {
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new AppSpecificExceptionHandler());
}
}
Swing異常處理實(shí)現(xiàn)
許多人沒有注意到現(xiàn)有的JOptionPanel類,該類中有許多的優(yōu)美的彈出對(duì)話框的靜態(tài)方法(showOptionDialog,showConfirmDialog,showInputDialog,和showMessageDialog),這些方法接受的參數(shù)不僅僅是字符串。這些靜態(tài)方法(也包括JOptionPanel構(gòu)造函數(shù))都是接受一個(gè)Object作為參數(shù)的的。下面是一個(gè)實(shí)現(xiàn)該類的核心代碼:
public class ErrorDialog {
public ErrorDialog() {
super();
}
public static void showQuickErrorDialog(JFrame parent, Exception e) {
final JTextArea textArea = new JTextArea();
textArea.setFont(new Font("Sans-Serif", Font.PLAIN, 10));
textArea.setEditable(false);
StringWriter writer = new StringWriter();
e.printStackTrace(new PrintWriter(writer));
textArea.setText(writer.toString());
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(350, 150));
JOptionPane.showMessageDialog(parent, scrollPane,
"An Error Has Occurred", JOptionPane.ERROR_MESSAGE);
}
}
在程序中的一個(gè)例圖如下:
