qiyadeng

          專(zhuān)注于Java示例及教程
          posts - 84, comments - 152, trackbacks - 0, articles - 34

          Swing中異常處理

          Posted on 2008-07-29 11:18 qiyadeng 閱讀(1484) 評(píng)論(0)  編輯  收藏

           

          每個(gè)Java程序員都要處理異常,異常處理在應(yīng)用程序中起著重要的作用。在Java世界中,處理異??瓷先ゲ皇悄敲春?jiǎn)單,不僅僅是在異常發(fā)生的地方,優(yōu)雅的報(bào)告異常。

          使用ThreadGroup處理異常

          ThreadGroup類(lèi)中在這個(gè)時(shí)候大部分方法已經(jīng)作廢了,但是該類(lèi)還是很有用的。ThreadGroup類(lèi)有一個(gè)方法uncaughtException(Thread,Throwable),意思是:當(dāng)線程組中的線程因?yàn)楫惓6K止時(shí),Java虛擬機(jī)調(diào)用該方法。這樣你可以考慮繼承ThreadGroup類(lèi)來(lái)處理你應(yīng)用中沒(méi)有捕獲的異常。

          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類(lèi)有兩個(gè)屬性-uncaughtExceptionHandler和defaultUncaughtExceptionHandler,它們有相應(yīng)的get/set方法。但是這兩個(gè)方法是不同的。讓我們看看處理異常的過(guò)程。

          n 使用uncaughtExceptionHandler為當(dāng)前線程處理異常。

          n 如果uncaughtExceptionHandler為空(null),使用線程組(如果用戶(hù)沒(méi)有顯示設(shè)置,線程組是uncaughtExceptionHandler的默認(rèn)實(shí)現(xiàn))。

          n 如果線程組是默認(rèn)的實(shí)現(xiàn),但是不是根線程組,將把錯(cuò)誤處理委派給父線程組。

          n 如果線程組是默認(rèn)的實(shí)現(xiàn),并且是根線程組,將使用線程(Thread)類(lèi)上設(shè)置的defaultUncaughtExceptionHandler方法。

          n 如果在線程類(lèi)沒(méi)有設(shè)置defaultUncaughtExceptionHandler,將調(diào)用Java5之前的ThreadGroup類(lèi)中的未捕獲異常方法。

          實(shí)現(xiàn)Thread.UncaughtExceptionHandler接口看起來(lái)也像上面實(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)

          許多人沒(méi)有注意到現(xiàn)有的JOptionPanel類(lèi),該類(lèi)中有許多的優(yōu)美的彈出對(duì)話框的靜態(tài)方法(showOptionDialog,showConfirmDialog,showInputDialog,和showMessageDialog),這些方法接受的參數(shù)不僅僅是字符串。這些靜態(tài)方法(也包括JOptionPanel構(gòu)造函數(shù))都是接受一個(gè)Object作為參數(shù)的的。下面是一個(gè)實(shí)現(xiàn)該類(lèi)的核心代碼:

          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è)例圖如下:

          clip_image002


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 晴隆县| 阿克陶县| 平江县| 乡城县| 樟树市| 涞源县| 兴业县| 渭源县| 博野县| 广宗县| 铜山县| 舞阳县| 元谋县| 梁河县| 乃东县| 长寿区| 临清市| 买车| 镇康县| 昌都县| 增城市| 金华市| 阿拉善右旗| 天台县| 台东县| 东乡族自治县| 黔西| 拉萨市| 如皋市| 蓝田县| 诸暨市| 安塞县| 宁武县| 舟山市| 延津县| 东安县| 宜城市| 平原县| 桃江县| 怀集县| 沈丘县|