第04章 異常
·本章學習目標理解致命性錯誤Error和異常Exception的基本概念及可能發生錯誤或異常的情況。
了解異常的類體系結構,檢查和非檢查型異常。
了解異常類Throwable及其子類所處理的異常種類。
深入理解拋出異常和捕捉異常的概念。
掌握在程序中使用try-catch-finally語句結構處理異常的方法。
掌握自定義異常的方法和主動拋出異常的方法。
·本章學習內容
異常的概念及產生的原因
處理異常的try、catch和finally語句
描述異常分類
開發程序來處理自己的異常
4.1 錯誤與異常的概念
程序運行時難免出現一些非正常的現象,例如死循環、除數為0、文件不存在、內存溢出等等。這些非正常的現象分為錯誤Error和異常Exception兩種。
1、錯誤Error
Error指的是致命性的錯誤,諸如死循環、遞歸無法結束、內存溢出、硬件設備錯誤(例如軟驅損壞、打印機缺紙等)。這一類的錯誤只能在編程階段解決,在程序運行時程序自身是無法自行處理的。
2、異常Exception
Exception又可譯為例外,指那些可以在編程時預測并可在程序運行時處理的錯誤。例如當兩個變量做除法運算時,可以預測作為除數的變量也可能其值為0,這樣在程序中就可以事先安排一段程序對這種異常的情況進行處理。
雖然異常是非致命性的錯誤,但是如果程序不加以處理,就默認由Java虛擬機處理,Java虛擬機在輸出一個異常信息后也會造成程序的非正常結束。所以編程時必須對可預料的異常進行處理。
3、異常對程序的影響
有些異常可以通過編譯,其異常只在程序運行到造成異常的語句時發生,例如“除數為0”的異常就是這樣。
也有的異常如果不加以處理就無法通過編譯,例如在線程的run方法中就必須對InterruptedException異常進行編程處理,否則無法通過編譯。
4.2 異常類的層次
異常類的層次結構如圖所示 :
4.3 異常類
4.3.1 Throwable類
在Java中,一切異常都是用異常類Throwable的直接或間接派生的某個異常類的實例來處理的。
Throwable類有兩個子類,為Error和Exception。
Exception類的子類分為兩種,即屬于RuntimeException類的子類和不屬于RuntimeException類的子類,其中RuntimeException類子類的異常基本上都是由于編程時不嚴謹的邏輯錯誤造成的,例如要求用戶輸入數字時沒有充分考慮到用戶有可能輸入非數字的字符、漢字等。編程時要充分估計到此類錯誤發生的可能性,并在程序中加以處理。
Error類的子類都有后綴Error,這些類處理的都是系統內部錯誤,這類錯誤是不可修復和處理的,只能被動地通知用戶發生了何種錯誤。
下表列出了Throwable類的常用方法,由于所有的異常類都是從Throwable類繼承而來的,所以所有的異常類,不論是Java提供的異常類還是自定義的異常類,都支持這些方法。
常用方法 |
解 釋 |
public String getMessage() |
返回一個與異常有關的字符串信息 |
public void printStackTrace() |
打印顯示異常拋出時的堆棧跟蹤狀態,并輸出到標準錯誤流中 |
public String toString() |
返回一個簡短描述異常對象的字符串信息 |
4.3.2常用的異常類
要進行異常處理編程,就要了解常用的異常類,表8-2給出了Exception類的常用構造方法,下表給出了Exception類中的常用子類。
構造方法 |
解 釋 |
public Exception() |
創建一個新的異常類 |
public Exception(String message) |
創建一個新的異常類并指定異常信息 |
異常類Exception的常用子類
異常類名 |
說明 |
|||
AWTException |
圖形界面異常 |
|||
ClassNotFoundException |
未找到欲裝載使用的類 |
|||
InterruptedException |
線程異常(例如睡眠、等待、被其他線程暫停) |
|||
IOException |
輸入、輸出異常 |
|||
FileNotFoundException |
未找到指定的文件或目錄 |
|||
UnknownHostException |
無法確定的主機IP地址 |
|||
MalformedURLException |
URL地址異常 |
|||
NoSuchMethodException |
未找到指定的方法 |
|||
RuntimeException |
運行時異常 |
|||
ArithmeticException |
算術異常(除數為0) |
|||
ClassCastException |
強制類型轉換異常 |
|||
IllegalArgumentException |
非法參數異常 |
|||
NumberFormatException |
數字格式異常 |
|||
IndexOutOfBoundsException |
索引異常 |
|||
ArrayIndexOutOfBoundsException |
數組下標越界 |
|||
StringIndexOutOfBoundsException |
字符串越界 |
|||
NullPointerException |
空指針異常(引用尚未分配內存空間的對象) |
|||
NegativeArraySizeException |
數組負下標異常 |
|||
SecurityException |
違背安全原則異常(例如Applet欲讀寫文件) |
4.4 異常的處理
4.4.1 try-catch-finally結構
Java異常處理是通過5個關鍵字(try、catch、throw、throws和finally)控制。被進行異常監控的代碼放在try語句塊中,如果異常發生,代碼可以捕捉(catch)異常,并用相應的方式進行處理,處理完成后可以在finally語句塊中定義異常處理結束后應該執行的代碼。
4.4.2異常的幾種處理格式
處理異常的基本方法是使用try-catch-finally結構,該結構的使用格式如下:
try{
<可能產生異常、需要進行異常處理的程序段>
}catch (ExceptionType1 e){
<對ExceptionType1異常進行處理的程序段>
}catch (ExceptionType2 e){
<對ExceptionType2異常進行處理的程序段>
}
……
finally{
<無論是否發生異常都要執行的程序段>
}
在以上格式中,try程序段是必須的,finally程序段可以沒有,catch程序段至少要有一個,如果try程序段中可能有多種異常,就要有一一對應的多個catch程序段。對于那些不進行異常處理就不能通過編譯的情況,當不想進行異常處理時也要寫一個空的catch程序段,象下面的樣子。
catch (ExceptionType e){ }
catch的參數中ExceptionType是異常類型,應為上表中所列的類或它們的父類,e是一個異常對象。
【例4.2】處理數組越界訪問。
有時,單個代碼段可能引起多個異常,這時必須定義多個catch子句,每個子句處理一種異常。異常引發是,一個catch語句被執行后,其他子句別忽略。
【例4.3】處理包含除0和數組溢出的多種異常。
【例4.5】運用嵌套try語句。
【例4.6】隱式嵌套try語句。
4.4.3主動拋出異常
當try程序段中發生異常時稱為拋出異常,而由catch程序段捕獲異常并進行處理。所以Java對異常的處理是按照“拋出——捕獲”的方式進行的。除了在try程序段由系統拋出異常外,程序員也可以故意主動地拋出異常,這要使用throw語句,以下是該語句的用法:
throw ExceptionObject
其中ExceptionObject是一個異常對象,而這個異常對象最常用的是Exception,所以throw語句最常見的寫法是:
throw new Exception("信息字符串");
【例4.7】拋出異常。
4.5 將異常交系統處理
有一些異常事先很難預料,或者雖然能夠預料但是可能性太多致使難以處理,在這些情況下可以把異常交給系統處理。例如創建一個文件流對象時,可能會遇到“文件不存在”的異常,這時就可以把異常交給交給系統來處理,不再需要用戶自行編寫try-catch-finally結構的異常處理程序。
要把異常交系統處理,就必須在可能產生異常的方法聲明中使用throws子語句來指定處理異常的異常類,若指定多個異常類,彼此用逗號隔開。具體的格式如下:
[修飾符] <返回值類型> <方法名> ([參數列表]) <throws 異常類>
例如創建一個文件輸入流對象時可能產生“文件不存在”的異常,若把該異常交系統自動處理,程序可以這樣來寫:
import java.io.*;
public class aFileInputStream{
public static void main(String args[]) throws IOException{
FileInputStream file1=new FileInputStream("myfile.txt");
}
}
以上程序一旦發生異常,會自動調用系統的IOException類進行處理。除了把異常交系統處理之外,也可以用throws子語句來指定自定義的異常類來處理異常。
【例4.8】聲明異常
4.6 自定義異常類
處理異常更靈活的方法是使用自定義的異常類。自定義的異常類通常都是繼承Java的Exception類或其子類。
【例4.9】自定義異常類。
·本章小結
在本章中學習了異常的概念和處理異常的方法。要對常用的異常有深刻的印象,才能熟練地處理系統已定義的異常,而要正確地處理異常必須掌握try-catch-finally語句結構的用法。
對于系統事先沒有定義的異常,需要用戶通過繼承Exception類自定義一個異常類,并實例化為一個異常對象,然后通過throw語句主動拋出自定義異常,從而調用自定義的異常對象處理異常,本章的程序“自定義異常類”就是使用自定義異常類處理異常的例子。
對于比較簡單的情況,也可以把異常交系統自行處理。
·習題
1、什么是異常?簡述Java的異常處理機制。
2、系統定義的異常與用戶自定義的異常有何不同?如何使用這兩類異常?
3、編寫從鍵盤讀入10個字符放入一個字符數組,并在屏幕上顯示它們的程序。請處理數組越界異常。posted on 2010-03-19 10:51 libifeng 閱讀(344) 評論(0) 編輯 收藏 所屬分類: Java課件