例外處理


Java 的例外處理就是在執行時期所產生的錯誤,由 JVM 控制,可分為 Exception(例外) , Error(錯誤),這2個類別都是 Throwable 類別的子類別,通常都針對 Exception 做處理,使用 try catch finally , 丟出(throw) 自訂訊息, 使用 throws 修飾方法, 建立自訂例外類別 , 使用 assert 顯示錯誤,
Error和RuntimeException可以不用try-catch,其他都要

   1:  package Test_Exception;
   2:   
   3:  public class Test_Exception {
   4:   
   5:      /**
   6:       * @param args
   7:       */
   8:      public static void main(String[] args) {
   9:          // TODO Auto-generated method stub
  10:   
  11:          int[] i = new int[]{0,1,2}; 
  12:          
  13:          //i[3] =0; 此行產生例外事件,沒有例外處理的話,輸出預設的錯誤訊息
  14:          /*
  15:           * java.lang.ArrayIndexOutOfBoundsException: 3
  16:              at Test_Exception.Test_Exception.main(Test_Exception.java:13)
  17:           */
  18:          
  19:          /**使用例外處理範例*/
  20:          try//使用 try 把可能發生例外的程式碼包住,必須和 catch 連用
  21:          {
  22:              i[3] =0;//此行產生例外事件後會到catch比對
  23:          }
  24:          catch(ArrayIndexOutOfBoundsException aiooe)//catch 區塊 可以多個,子類別必須排在前面,會和try區塊產生的例外比對
  25:          {
  26:              System.out.println("進入  aiooe ");
  27:              aiooe.printStackTrace();//印出預設的錯誤訊息
  28:              /*
  29:               * java.lang.ArrayIndexOutOfBoundsException: 3
  30:                  at Test_Exception.Test_Exception.main(Test_Exception.java:21)
  31:               */
  32:          }
  33:          catch(Exception e1)//不會執行這裡,因為在前1個catch已經符合例外
  34:          {
  35:              System.out.println("進入  e1 ");
  36:              e1.printStackTrace();
  37:          }
  38:  //        catch(RuntimeException re)//編譯錯誤,若有多個 catch ,必須把子類別catch放在前面
  39:  //        {
  40:  //            
  41:  //        }
  42:          finally//finally區塊 只能單個,無論有沒有發生例外都會執行這裡
  43:          {
  44:              System.out.println("finally 執行");
  45:          }
  46:          
  47:          /**使用自訂例外訊息範例*/
  48:          try{
  49:              
  50:          i[0] = -1;
  51:          
  52:          for(int i2 : i)
  53:          {
  54:              if(i2<0)
  55:                  //如果不予許i陣列值中設定負數元素,可用 throw 產生例外,並傳入自訂顯示訊息,必須用 try-catch包括
  56:                  throw new Exception("使用自訂例外訊息:i陣列中有負數元素");
  57:          }
  58:          
  59:          }
  60:          catch(Exception e)
  61:          {
  62:              e.printStackTrace();
  63:              /*
  64:               * java.lang.Exception: 使用自訂例外訊息:i陣列中有負數元素
  65:                  at Test_Exception.Test_Exception.main(Test_Exception.java:55
  66:               */
  67:          }
  68:          
  69:          /**使用自訂例外類別範例*/
  70:          try{
  71:              
  72:          i[1] = -2;
  73:          
  74:              for(int i2 : i)
  75:              {
  76:                  if(i2<0)
  77:                  {
  78:                      throw new ArrayNoNativeNumberException("使用自訂例外類別:i陣列中有負數元素");
  79:                  }
  80:              }
  81:          }
  82:          catch(ArrayNoNativeNumberException aioobe)
  83:          {
  84:              aioobe.printStackTrace();
  85:              /*
  86:               * Test_Exception.ArrayNoNativeNumberException: 使用自訂例外類別:i陣列中有負數元素
  87:                  at Test_Exception.Test_Exception.main(Test_Exception.java:75)
  88:               */
  89:          }
  90:      
  91:          /**使用 throws 範例*/ 
  92:          try{
  93:              
  94:          callException();//使用 throws 修飾方法,當使用該方法時,就必須用try-catch包括
  95:          
  96:          }
  97:          catch(Exception e)
  98:          {
  99:              e.printStackTrace();
 100:          }
 101:          
 102:          /**使用 assert 測試錯誤,執行指令必須加入 -ea 如, java -ea Test_Exception*/
 103:          for(int itemp : i)
 104:          {
 105:              // assert 條件式 : 執行內容 ; 注意:條件式必須為 false 才會執行
 106:              assert itemp>0 : "使用assertError:i陣列中有負數元素";
 107:          }
 108:      }
 109:   
 110:      //方法中可能出現例外就用 throws 例外類別,當使用該方法時,就必須用try-catch包括
 111:      public static void callException() throws Exception
 112:      { 
 113:  //        throw new Exception("331231");
 114:   
 115:      }
 116:      
 117:      
 118:  }
 119:   
 120:  //自訂例外類別
 121:  class ArrayNoNativeNumberException extends Exception
 122:  {
 123:      public ArrayNoNativeNumberException(String s1) 
 124:      {
 125:          super(s1);
 126:      }
 127:  }