第04章 異常

          ·本章學(xué)習(xí)目標(biāo)

          理解致命性錯誤Error和異常Exception的基本概念及可能發(fā)生錯誤或異常的情況。

          了解異常的類體系結(jié)構(gòu),檢查和非檢查型異常。

          了解異常類Throwable及其子類所處理的異常種類。

          深入理解拋出異常和捕捉異常的概念。

          掌握在程序中使用try-catch-finally語句結(jié)構(gòu)處理異常的方法。

          掌握自定義異常的方法和主動拋出異常的方法。

          ·本章學(xué)習(xí)內(nèi)容

          異常的概念及產(chǎn)生的原因

          處理異常的trycatchfinally語句

          描述異常分類

          開發(fā)程序來處理自己的異常

          4.1 錯誤與異常的概念

          程序運行時難免出現(xiàn)一些非正常的現(xiàn)象,例如死循環(huán)、除數(shù)為0、文件不存在、內(nèi)存溢出等等。這些非正常的現(xiàn)象分為錯誤Error和異常Exception兩種。

          1、錯誤Error

          Error指的是致命性的錯誤,諸如死循環(huán)、遞歸無法結(jié)束、內(nèi)存溢出、硬件設(shè)備錯誤(例如軟驅(qū)損壞、打印機缺紙等)。這一類的錯誤只能在編程階段解決,在程序運行時程序自身是無法自行處理的。

          2、異常Exception

          Exception又可譯為例外,指那些可以在編程時預(yù)測并可在程序運行時處理的錯誤。例如當(dāng)兩個變量做除法運算時,可以預(yù)測作為除數(shù)的變量也可能其值為0,這樣在程序中就可以事先安排一段程序?qū)@種異常的情況進(jìn)行處理。

          雖然異常是非致命性的錯誤,但是如果程序不加以處理,就默認(rèn)由Java虛擬機處理,Java虛擬機在輸出一個異常信息后也會造成程序的非正常結(jié)束。所以編程時必須對可預(yù)料的異常進(jìn)行處理。

          3、異常對程序的影響

          有些異常可以通過編譯,其異常只在程序運行到造成異常的語句時發(fā)生,例如“除數(shù)為0”的異常就是這樣。

          也有的異常如果不加以處理就無法通過編譯,例如在線程的run方法中就必須對InterruptedException異常進(jìn)行編程處理,否則無法通過編譯。

          4.2 異常類的層次

          異常類的層次結(jié)構(gòu)如圖所示 :

          4.3 異常類

          4.3.1 Throwable

          Java中,一切異常都是用異常類Throwable的直接或間接派生的某個異常類的實例來處理的。

          Throwable類有兩個子類,為ErrorException

          Exception類的子類分為兩種,即屬于RuntimeException類的子類和不屬于RuntimeException類的子類,其中RuntimeException類子類的異常基本上都是由于編程時不嚴(yán)謹(jǐn)?shù)倪壿嬪e誤造成的,例如要求用戶輸入數(shù)字時沒有充分考慮到用戶有可能輸入非數(shù)字的字符、漢字等。編程時要充分估計到此類錯誤發(fā)生的可能性,并在程序中加以處理。

          Error類的子類都有后綴Error,這些類處理的都是系統(tǒng)內(nèi)部錯誤,這類錯誤是不可修復(fù)和處理的,只能被動地通知用戶發(fā)生了何種錯誤。

          下表列出了Throwable類的常用方法,由于所有的異常類都是從Throwable類繼承而來的,所以所有的異常類,不論是Java提供的異常類還是自定義的異常類,都支持這些方法。

          常用方法

               

          public String getMessage()

          返回一個與異常有關(guān)的字符串信息

          public void printStackTrace()

          打印顯示異常拋出時的堆棧跟蹤狀態(tài),并輸出到標(biāo)準(zhǔn)錯誤流中

          public String toString()

          返回一個簡短描述異常對象的字符串信息

          4.3.2常用的異常類

              要進(jìn)行異常處理編程,就要了解常用的異常類,表8-2給出了Exception類的常用構(gòu)造方法,下表給出了Exception類中的常用子類。

          構(gòu)造方法

                 

          public Exception()

          創(chuàng)建一個新的異常類

          public Exception(String message)

          創(chuàng)建一個新的異常類并指定異常信息

          異常類Exception的常用子類

          AWTException

          圖形界面異常

          ClassNotFoundException

          未找到欲裝載使用的類

          InterruptedException

          線程異常(例如睡眠、等待、被其他線程暫停)

          IOException

          輸入、輸出異常

          FileNotFoundException

          未找到指定的文件或目錄

          UnknownHostException

          無法確定的主機IP地址

          MalformedURLException

          URL地址異常

          NoSuchMethodException

          未找到指定的方法

          RuntimeException

          運行時異常

          ArithmeticException

          算術(shù)異常(除數(shù)為0

          ClassCastException

          強制類型轉(zhuǎn)換異常

          IllegalArgumentException

          非法參數(shù)異常

          NumberFormatException

          數(shù)字格式異常

          IndexOutOfBoundsException

          索引異常

          ArrayIndexOutOfBoundsException

          數(shù)組下標(biāo)越界

          StringIndexOutOfBoundsException

          字符串越界

          NullPointerException

          空指針異常(引用尚未分配內(nèi)存空間的對象)

          NegativeArraySizeException

          數(shù)組負(fù)下標(biāo)異常

          SecurityException

          違背安全原則異常(例如Applet欲讀寫文件)

          4.4 異常的處理

          4.4.1 try-catch-finally結(jié)構(gòu)

          Java異常處理是通過5個關(guān)鍵字(trycatchthrowthrowsfinally)控制。被進(jìn)行異常監(jiān)控的代碼放在try語句塊中,如果異常發(fā)生,代碼可以捕捉(catch)異常,并用相應(yīng)的方式進(jìn)行處理,處理完成后可以在finally語句塊中定義異常處理結(jié)束后應(yīng)該執(zhí)行的代碼

          4.4.2異常的幾種處理格式

          處理異常的基本方法是使用try-catch-finally結(jié)構(gòu),該結(jié)構(gòu)的使用格式如下:

          try{

          <可能產(chǎn)生異常、需要進(jìn)行異常處理的程序段>

          }catch (ExceptionType1 e){

          <ExceptionType1異常進(jìn)行處理的程序段>

          }catch (ExceptionType2 e){

          <ExceptionType2異常進(jìn)行處理的程序段>

          }

          ……

          finally{

          <無論是否發(fā)生異常都要執(zhí)行的程序段>

          }

          在以上格式中,try程序段是必須的,finally程序段可以沒有,catch程序段至少要有一個,如果try程序段中可能有多種異常,就要有一一對應(yīng)的多個catch程序段。對于那些不進(jìn)行異常處理就不能通過編譯的情況,當(dāng)不想進(jìn)行異常處理時也要寫一個空的catch程序段,象下面的樣子。

          catch (ExceptionType e){   }

          catch的參數(shù)中ExceptionType是異常類型,應(yīng)為上表中所列的類或它們的父類,e是一個異常對象。

          【例4.2】處理數(shù)組越界訪問。

              有時,單個代碼段可能引起多個異常,這時必須定義多個catch子句,每個子句處理一種異常。異常引發(fā)是,一個catch語句被執(zhí)行后,其他子句別忽略。

          【例4.3】處理包含除0和數(shù)組溢出的多種異常。  

          【例4.5】運用嵌套try語句。

          【例4.6】隱式嵌套try語句。

          4.4.3主動拋出異常

          當(dāng)try程序段中發(fā)生異常時稱為拋出異常,而由catch程序段捕獲異常并進(jìn)行處理。所以Java對異常的處理是按照“拋出——捕獲”的方式進(jìn)行的。除了在try程序段由系統(tǒng)拋出異常外,程序員也可以故意主動地拋出異常,這要使用throw語句,以下是該語句的用法:

          throw ExceptionObject

          其中ExceptionObject是一個異常對象,而這個異常對象最常用的是Exception,所以throw語句最常見的寫法是:

          throw new Exception("信息字符串");

          【例4.7】拋出異常。

          4.5 將異常交系統(tǒng)處理

          有一些異常事先很難預(yù)料,或者雖然能夠預(yù)料但是可能性太多致使難以處理,在這些情況下可以把異常交給系統(tǒng)處理。例如創(chuàng)建一個文件流對象時,可能會遇到“文件不存在”的異常,這時就可以把異常交給交給系統(tǒng)來處理,不再需要用戶自行編寫try-catch-finally結(jié)構(gòu)的異常處理程序。

          要把異常交系統(tǒng)處理,就必須在可能產(chǎn)生異常的方法聲明中使用throws子語句來指定處理異常的異常類,若指定多個異常類,彼此用逗號隔開。具體的格式如下:

          [修飾符] <返回值類型> <方法名> [參數(shù)列表] <throws 異常類>

          例如創(chuàng)建一個文件輸入流對象時可能產(chǎn)生“文件不存在”的異常,若把該異常交系統(tǒng)自動處理,程序可以這樣來寫:

          import java.io.*;

          public class aFileInputStream{

              public static void main(String args[]) throws IOException{

                  FileInputStream file1=new FileInputStream("myfile.txt");

               }

          }

              以上程序一旦發(fā)生異常,會自動調(diào)用系統(tǒng)的IOException類進(jìn)行處理。除了把異常交系統(tǒng)處理之外,也可以用throws子語句來指定自定義的異常類來處理異常。

          【例4.8】聲明異常

          4.6 自定義異常類

          處理異常更靈活的方法是使用自定義的異常類。自定義的異常類通常都是繼承JavaException類或其子類。

          【例4.9】自定義異常類。

          ·本章小結(jié)

          在本章中學(xué)習(xí)了異常的概念和處理異常的方法。要對常用的異常有深刻的印象,才能熟練地處理系統(tǒng)已定義的異常,而要正確地處理異常必須掌握try-catch-finally語句結(jié)構(gòu)的用法。

          對于系統(tǒng)事先沒有定義的異常,需要用戶通過繼承Exception類自定義一個異常類,并實例化為一個異常對象,然后通過throw語句主動拋出自定義異常,從而調(diào)用自定義的異常對象處理異常,本章的程序“自定義異常類”就是使用自定義異常類處理異常的例子。

          對于比較簡單的情況,也可以把異常交系統(tǒng)自行處理。

          ·習(xí)題

          1、什么是異常?簡述Java的異常處理機制。

          2、系統(tǒng)定義的異常與用戶自定義的異常有何不同?如何使用這兩類異常?

          3、編寫從鍵盤讀入10個字符放入一個字符數(shù)組,并在屏幕上顯示它們的程序。請?zhí)幚頂?shù)組越界異常。

          posted on 2010-03-19 10:51 libifeng 閱讀(344) 評論(0)  編輯  收藏 所屬分類: Java課件

          <2010年3月>
          28123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 莆田市| 延寿县| 南陵县| 桑植县| 湖南省| 惠水县| 和顺县| 广饶县| 定安县| 建始县| 菏泽市| 白玉县| 陆河县| 合江县| 曲麻莱县| 固阳县| 和林格尔县| 广丰县| 莲花县| 屏东县| 京山县| 正蓝旗| 南木林县| 威远县| 盘山县| 台山市| 南宫市| 沁阳市| 伽师县| 杭州市| 电白县| 库尔勒市| 渭源县| 内丘县| 金华市| 江永县| 衡山县| 五指山市| 泸溪县| 北流市| 枝江市|