熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

創建自己的違例

2013-11-15 11:42:52  來源: JSP教程 

  並不一定非要使用Java違例這一點必須掌握因為經常都需要創建自己的違例以便指出自己的庫可能生成的一個特殊錯誤——但創建Java分級結構的時候這個錯誤是無法預知的
  為創建自己的違例類必須從一個現有的違例類型繼承——最好在含義上與新違例近似繼承一個違例相當簡單
  
  //: Inheritingjava
  // Inheriting your own exceptions
  
  class MyException extends Exception {
   public MyException() {}
   public MyException(String msg) {
    super(msg);
   }
  }
  
  public class Inheriting {
   public static void f() throws MyException {
    Systemoutprintln(
     Throwing MyException from f());
    throw new MyException();
   }
   public static void g() throws MyException {
    Systemoutprintln(
     Throwing MyException from g());
    throw new MyException(Originated in g());
   }
   public static void main(String[] args) {
    try {
     f();
    } catch(MyException e) {
     eprintStackTrace();
    }
    try {
     g();
    } catch(MyException e) {
     eprintStackTrace();
    }
   }
  } ///:~
  
  繼承在創建新類時發生
  
  class MyException extends Exception {
   public MyException() {}
   public MyException(String msg) {
    super(msg);
   }
  }
  
  這裡的關鍵是extends Exception它的意思是除包括一個Exception的全部含義以外還有更多的含義增加的代碼數量非常少——實際只添加了兩個構建器對MyException的創建方式進行了定義請記住假如我們不明確調用一個基礎類構建器編譯器會自動調用基礎類默認構建器在第二個構建器中通過使用super關鍵字明確調用了帶有一個String參數的基礎類構建器
  該程序輸出結果如下
  
  Throwing MyException from f()
  MyException
      at Inheritingf(Inheritingjava:)
      at Inheritingmain(Inheritingjava:)
  Throwing MyException from g()
  MyException: Originated in g()
      at Inheritingg(Inheritingjava:)
      at Inheritingmain(Inheritingjava:)
  
  可以看到在從f()出的MyException違例中缺乏詳細的消息
  創建自己的違例時還可以采取更多的操作我們可添加額外的構建器及成員
  
  //: Inheritingjava
  // Inheriting your own exceptions
  
  class MyException extends Exception {
   public MyException() {}
   public MyException(String msg) {
    super(msg);
   }
   public MyException(String msg int x) {
    super(msg);
    i = x;
   }
   public int val() { return i; }
   private int i;
  }
  
  public class Inheriting {
   public static void f() throws MyException {
    Systemoutprintln(
     Throwing MyException from f());
    throw new MyException();
   }
   public static void g() throws MyException {
    Systemoutprintln(
     Throwing MyException from g());
    throw new MyException(Originated in g());
   }
   public static void h() throws MyException {
    Systemoutprintln(
     Throwing MyException from h());
    throw new MyException(
     Originated in h() );
   }
   public static void main(String[] args) {
    try {
     f();
    } catch(MyException e) {
     eprintStackTrace();
    }
    try {
     g();
    } catch(MyException e) {
     eprintStackTrace();
    }
    try {
     h();
    } catch(MyException e) {
     eprintStackTrace();
     Systemoutprintln(eval() = + eval());
    }
   }
  } ///:~
  
  此時添加了一個數據成員i同時添加了一個特殊的方法用它讀取那個值也添加了一個額外的構建器用它設置那個值輸出結果如下
  
  Throwing MyException from f()
  MyException
      at Inheritingf(Inheritingjava:)
      at Inheritingmain(Inheritingjava:)
  Throwing MyException from g()
  MyException: Originated in g()
      at Inheritingg(Inheritingjava:)
      at Inheritingmain(Inheritingjava:)
  Throwing MyException from h()
  MyException: Originated in h()
      at Inheritingh(Inheritingjava:)
      at Inheritingmain(Inheritingjava:)
  eval() =
  
  由於違例不過是另一種形式的對象所以可以繼續這個進程進一步增強違例類的能力但要注意對使用自己這個包的客戶程序員來說他們可能錯過所有這些增強因為他們可能只是簡單地尋找准備生成的違例除此以外不做任何事情——這是大多數Java庫違例的標准用法若出現這種情況有可能創建一個新違例類型其中幾乎不包含任何代碼
  //: SimpleExceptionjava
  class SimpleException extends Exception {
  } ///:~
  它要依賴編譯器來創建默認構建器(會自動調用基礎類的默認構建器)當然在這種情況下我們不會得到一個SimpleException(String)構建器但它實際上也不會經常用到
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19485.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.