華恩JAVA班第28天

Amare丶發表於2017-06-08

華恩JAVA班第28天

 

異常筆記:

 


0、error和exception有什麼區別?
  Error類和Exception類都繼承自Throwable類。
 Error(錯誤)表示系統級的錯誤和程式不必處理的異常,是java執行環境中的內部錯誤或者硬體問題,比如,記憶體資源不足等,對於這種錯誤,程式基本無能為力,除了退出執行別無選擇。
 Exception表示需要捕捉或者程式進行處理的異常,一般是因為程式設計的瑕疵而引起的問題或者外在的輸入等引起的一般性問題,是程式必須處理的。

1、異常分類
 (1)所有的異常都是由Throwable繼承而來,但在下一層分解為兩個分支:Error和Exception。
 (2)Error類層次結構描述了Java執行時系統的內部錯誤和資源耗盡錯誤。應用程式不應該丟擲這種型別的物件。
      如果出現了這樣的內部錯誤,除了通知給使用者,並盡力使程式安全地終止之外,再也無能為力了。
 (3)在設計Java程式時,需要關注Exception層次結構。這個層次結構又分為兩個分支:
     ① 一個分支派生於RuntimeException。由程式錯誤導致的異常屬於RuntimeException。
     ② 另一個分支包含其他異常。程式本身沒問題,但由於像I/0錯誤這類問題導致的異常屬於其他異常。
     如果出現了RuntimeException異常,那麼一定是程式設計師的問題。
 (4)Java語言規範將派生於Error類或RuntimeException類的所有異常稱為未檢查(unchecked)異常;所有其他的異常稱為已檢查(checked)異常。
      編譯器將核查是否為所有的已檢查異常提供了異常處理器。
  
  java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲未被捕獲的執行時異常。

2、宣告已檢查異常
  (1)如果遇到無法處理的情況,那麼java的方法可以丟擲一個異常。
  (2)一個方法必須宣告所有可能丟擲的已檢查異常。
     (3)對於那些可能被他人使用的java方法,應該根據異常規範(exceptionspecification),在方法的首部宣告這個方法可能丟擲的異常。
      如果一個方法有可能丟擲多個已檢查異常,就必須在方法的首部列出所有的異常類。如下面例子所示:
          public Image loadImage(String s) throws EOFException,MalformedURLException
          { ... }'
  (4)在java中,沒有throws說明符的方法將不能丟擲任何已檢查異常。
 (5)如果在子類中覆蓋了超類的一個方法,子類方法中宣告的已檢查異常不能超過超類方法中宣告的範圍。
      如果超類方法沒有丟擲任何已檢查異常,子類也不能丟擲任何已檢查異常。
  (6)不應該宣告java的內部錯誤,即從Error繼承的錯誤。
      不應該宣告從RuntimeException繼承的那些未檢查異常。

3、丟擲異常
  (1)對於一個已經存在的異常類,將其丟擲非常容易:
      ① 找到一個合適的異常類。
      ② 建立這個類的一個物件。
      ③ 將物件丟擲。
  (2)一旦方法丟擲了異常,這個方法就不可能返回到呼叫者。

4、建立異常類
  只需要定義一個派生於Exception的類,或者派生於Exception子類的類。
  習慣上,定義的異常類應該包含兩個構造器:一個是預設構造器;另一個是帶有詳細描述資訊的構造器。例如:
       class FileFormatException extends IOExcption
       {
               public FileFormatException(){}
               public FileFormatException(String gripe)
               {
                       super(gripe);
               }
       }

5、捕獲異常
 (1)如果某個異常發生的時候沒有在任何地方進行捕獲,那麼程式就會終止執行,並在控制檯上列印出異常資訊。
  (2)如果呼叫了一個丟擲已檢查異常的方法,就必須對它進行處理,或者將它傳遞出去。
      通過,應該捕獲那些知道如何處理的異常,而將那些不知道怎樣處理的異常傳遞出去。如果想將異常傳遞出去,就必須在方法的首部新增一個throws說明符。
 (3)如果編寫一個覆蓋超類的方法,而這個方法又沒有丟擲異常,那麼這個方法就必須捕獲方法程式碼中出現的每一個已檢查異常。
      不允許在子類的throws說明符中出現超過超類的方法所列出的異常類範圍。

6、再次丟擲異常與異常鏈

7、finally子句
 當try{}裡有一個return語句的時候,finally{}中的程式碼也會在return之前執行。

 

 

上課例子:

一:

package com.zgz;
import java.util.InputMismatchException;
import java.util.Scanner;

 *檔名稱:Test.java
 *功能說明:
 *開發人員:Ziu Ginzeon
 *建立時間:2013年7月25日 下午2:26:25

public class Test {

 public static void main(String[] args){
  // TODO Auto-generated methodstub
  try{
   System.out.println("請輸入課程代號1.語文2.數學 3.英語");
   Scanner in =new Scanner(System.in);
   int a =in.nextInt();
   if(a ==1){
    System.out.println("語文");
   }else if(a ==2){
    System.out.println("數學");
   }else if(a ==3){
    System.out.println("英語");
   }else{
    thrownew Exception();
   }
  }catch(InputMismatchExceptione){
   System.out.println("輸入錯誤,必須是整數");
   e.printStackTrace();
  }catch(Exception e){
   System.out.println("輸入錯誤,必須是1,2或3");
   e.printStackTrace();
  }finally{
   System.out.println("歡迎提出建議");
  }
 }
}

 

二:

package com.zjj;

 *檔名稱:PessonException.java
 *功能說明:
 *開發人員:Ziu Ginzeon
 *建立時間:2013年7月25日 下午3:03:21
 
public class Pesson {
 private String name ="tom";
 private int age;
 private String sex;
 public void setAge(int age)throwsException{
  if(age>100||age<=0)
   throw newException("年齡必須大於0並且小於等於100");
  else{
   this.age =age;
  }
 }
 public void setSex(String sex)throwsException{
  if("男".equals(sex)||"女".equals(sex))
   this.sex =sex;
  else{
   throw newException("性別必須是“男”或者是“女”");
  }
 }
 public void print(){
  System.out.println(this.name+"("+this.sex+","+this.age+"歲)");
 }
}

 

package com.zjj;

import java.util.Scanner;

 *檔名稱:PessonExceptionTest.java
 *功能說明:
 *開發人員:Ziu Ginzeon
 *建立時間:2013年7月25日 下午3:10:10

public class PessonExceptionTest {

 public static void main(String[] args) {
  // TODO Auto-generated methodstub
  Pesson pesson = newPesson();
  Scanner in = newScanner(System.in);
  try {
   System.out.println("請輸入年齡");
   int b =in.nextInt();
   pesson.setAge(b);
   System.out.println("請輸入性別");
   String a =in.next();
   pesson.setSex(a);
  } catch (Exception e) {
   // TODOAuto-generated catch block
   e.printStackTrace();
  }finally{
   System.out.println("歡迎使用");
  }
  pesson.print();
 }
}

 

 

相關文章