posts - 241,  comments - 116,  trackbacks - 0
          定義三個異常類:ExceptionA,ExceptionB,ExceptionC

           
          ?
          public class ExceptionA extends Exception {
              public ExceptionA(String str) {
                  super();
              }
          }
           
          public class ExceptionB extends ExceptionA {
           
              public ExceptionB(String str) {
                  super(str);
              }
          }
           
          public class ExceptionC extends ExceptionA {
              public ExceptionC(String str) {
                  super(str);
              }
          }

          異常丟失的情況:

           
          ?
          public class NeverCaught {
              static void f() throws ExceptionB{
                  throw new ExceptionB("exception b");
              }
           
              static void g() throws ExceptionC {
                  try {
                      f();
                  } catch (ExceptionB e) {
                      ExceptionC c = new ExceptionC("exception a");
                      throw c;
                  }
              }
           
              public static void main(String[] args) {
                      try {
                          g();
                      } catch (ExceptionC e) {
                          e.printStackTrace();
                      }
              }
           
          }
          /*
          exception.ExceptionC
          at exception.NeverCaught.g(NeverCaught.java:12)
          at exception.NeverCaught.main(NeverCaught.java:19)
          */

          為什么只是打印出來了ExceptionC而沒有打印出ExceptionB呢?這個還是自己分析一下吧!

          上面的情況相當于少了一種異常,這在我們排錯的過程中非常的不利。那我們遇到上面的情況應該怎么辦呢?這就是異常鏈的用武之地:保存異常信息,在拋出另外一個異常的同時不丟失原來的異常。

           
          ?
          public class NeverCaught {
              static void f() throws ExceptionB{
                  throw new ExceptionB("exception b");
              }
           
              static void g() throws ExceptionC {
                  try {
                      f();
                  } catch (ExceptionB e) {
                      ExceptionC c = new ExceptionC("exception a");
                      //異常連
                      c.initCause(e);
                      throw c;
                  }
              }
           
              public static void main(String[] args) {
                      try {
                          g();
                      } catch (ExceptionC e) {
                          e.printStackTrace();
                      }
              }
           
          }
          /*
          exception.ExceptionC
          at exception.NeverCaught.g(NeverCaught.java:12)
          at exception.NeverCaught.main(NeverCaught.java:21)
          Caused by: exception.ExceptionB
          at exception.NeverCaught.f(NeverCaught.java:5)
          at exception.NeverCaught.g(NeverCaught.java:10)
          ... 1 more
          */

          這個異常鏈的特性是所有異常均具備的,因為這個initCause()方法是從Throwable繼承的。
          posted on 2011-12-26 10:25 墻頭草 閱讀(1554) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          人人游戲網 軟件開發網 貨運專家
          主站蜘蛛池模板: 彭泽县| 济南市| 江川县| 措勤县| 鹤峰县| 湄潭县| 改则县| 太保市| 和静县| 阿勒泰市| 定安县| 资溪县| 冕宁县| 唐河县| 芮城县| 徐水县| 米易县| 顺昌县| 宕昌县| 上饶县| 离岛区| 长泰县| 乃东县| 鄄城县| 柳州市| 额济纳旗| 会东县| 久治县| 海门市| 呼伦贝尔市| 庆城县| 喀喇沁旗| 七台河市| 白朗县| 昭通市| 长寿区| 东安县| 宜春市| 慈溪市| 繁昌县| 桐庐县|