版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、8.1 異常處理概述8.2 異常處理機制8.3 異常類8.4 綜合實例8.5 習題8.1.1 異常處理的概念 異常是指在某些情況下,會使當前正在執(zhí)行的方法或代碼塊無法繼續(xù)進行的問題。 異常是程序中的一些錯誤,但并不是所有的錯誤都是異常,并且錯誤有時候是可以避免的。例如,代碼中如果少了一個分號,那么運行出來結果是提示是錯誤java.lang.Error;而如果代碼為System.out.println(8/0),用0做了除數(shù),那么會會拋出java.lang.ArithmeticException的異常。【實例8-1】Exception.java public class Exception pu
2、blic static void main(String args) int denominator = 0; if (denominator != 0) int numerator = 8 / denominator; else System.out.println(除數(shù)為零); System.out.println(numerator); 運行結果:程序說明: 在這個實例中,不考慮異常的作用,因此為了避免除數(shù)為零,最好的做法就是進行一次判斷if (denominator != 0),當除數(shù)不為零的時候才進入循環(huán)做除法,否則直接打印輸出結果,這個時候被除數(shù)還沒有聲明,因此程序會出錯,拋出ja
3、va.lang.Error的異常?!緦嵗?-2】Exception.java public class Exception public static void main(String args) int denominator = 0; int numerator = 8 / denominator; System.out.println(numerator); 運行結果:8.1.2 使用異常處理的原因程序執(zhí)行時經(jīng)常會出現(xiàn)用戶輸入出錯、所需文件找不到、運行時磁盤空間不夠、內存耗盡無法進行類的實例化、算術運算錯、數(shù)組下標越界、JVM崩潰等運行錯誤,影響程序的正常執(zhí)行。錯誤及異常是不可避免的,一
4、個好的應用程序,在滿足用戶要求的各種功能的同時,還應具備能預見程序執(zhí)行過程中可能產(chǎn)生的各種異常的能力,并能為異常情況給予恰當處理。Java語言通過面向對象的異常處理機制來解決運行期間的錯誤,可以預防錯誤的程序代碼或系統(tǒng)錯誤所造成的不可預期的結果發(fā)生。8.1.3 方法的調用堆棧 Java虛擬機用方法調用堆棧來跟蹤每個線程中一系列的方法調用過程。每個線程都有一個獨立的方法調用堆棧,堆棧底部的是程序的入口方法main(),放一個新的方法被調用時,java虛擬機就會把描述該方法的堆棧結構置入棧頂,位于棧頂?shù)姆椒ㄊ钦趫?zhí)行的方法。Java對異常的處理主要涉及兩方面的內容:一是拋出(throw)異常 如果
5、程序在運行過程中出現(xiàn)了運行錯誤,并且產(chǎn)生的異常與系統(tǒng)中預定義某個異常類相對應,系統(tǒng)就自動產(chǎn)生一個該異常類的對象,這個過程稱為拋出(throw)異常。二是捕捉(catch)異常 當有異常對象拋出時,將在程序中尋找處理這個異常的代碼,如果找到處理代碼,則把異常對象交給該段代碼進行處理,這個過程稱為捕捉(catch)異常。8.2.1 捕獲異常 我們經(jīng)常會遇見這樣的情景:程序中出現(xiàn)了異常但是沒有相應的處理措施。這時候java語言就會自動捕獲并處理異常,一般來說表現(xiàn)為報告異常字符串,并且在異常發(fā)生出結束程序的運行。但是,為了更好的保證程序正常運行,需要人為的捕獲并處理異常。在java語言中該機制的使用是
6、try-catch-finally結構。try-catch-finally結構的一般格式如下:try 可能拋出異常的語句 catch ( Exception1 e) 異常處理代碼 catch ( Exception2 e) 異常處理代碼 finally 必需執(zhí)行的代碼 如果在程序中有效的設計了try-catch-finally結構,會出現(xiàn)兩種情況:能夠捕獲到異常和不能捕獲到異常。如果沒有捕獲到異常時,程序會跳過catch直接到finally(如圖8-3 沒有捕獲到異常時)如果捕獲到某個異常,則進入相應的catch塊內(如圖8-4 捕獲到某個異常時)try 語句 1; 語句 2;catch (
7、Exception1 e) catch ( Exception2 e) finally 語句;try 語句 1; 語句 2;catch ( Exception1 e) catch ( Exception2 e) finally 語句;圖8-3 沒有捕獲到異常時 圖8-4 捕獲到某個異常時8.2.2 聲明異常 try-catch-finally是在產(chǎn)生異常的方法內部處理異常。除此之外,還可以通過調用產(chǎn)生異常的方法來處理這些異常。在方法的聲明中使用throws語句,其一般格式如下: 方法名(參數(shù)) throws 方法體;【實例8-5】ThrowsException.javapublic class
8、 ThrowsException static void test(int a) throws ArithmeticException,ArrayIndexOutOfBoundsException System.out.println(In Situation + a);if (a = 0) System.out.println(no Exception caught);return; else if (a = 1) int iArray = new int4;iArray10 = 3;public static void main(String args) /try-catch-finall
9、y結構try test(0);test(1); catch (ArrayIndexOutOfBoundsException e) System.out.println(Catch + e); finally System.out.println(in Proc finally);運行結果:In Situation0no Exception caughtIn Situation1Catch java.lang.ArrayIndexOutOfBoundsException: 10in Proc finally8.2.3 拋出異常 日常生活中,例如學校中有什么問題都會先去問老師,但是有一些問題例如轉
10、學是不能由老師來解決的,這時候老師就需要再去問校長,由校長來解決這個問題??赡苄iL還有不能解決的問題,就需要去問教育部。拋出異常也是這樣的,當一個程序段發(fā)生異常時,如果自己不能夠進行異常處理,就可以將拋出異常給上一層。如果上一層也不能解決就可以一直向上拋出異常,直到拋出給main方法。如果仍然不能解決,就會中斷程序,將異常顯示出來。 在java語言中,所有方法都是通過throw語句來拋出一個異常事件,拋出異常首先需要通過throw語句生成一個異常類的對象,其一般格式如下: throw new 異常類名; 注意:異常類名必須是Exception或其直接或間接子類。利用throw語句,可以自定義異
11、常,并顯示自定義的異常信息。【實例8-6】ThrowException.javaclass ThrowException public static void main(String args) try throwTest(); catch (NullPointerException e) System.out.println(Recaught: + e);static void throwTest() try throw new NullPointerException(test); catch (NullPointerException e) System.out.println(Caug
12、ht inside throwTest.);throw e;運行結果:Caught inside throwTest.Recaught:java.lang.NullPointerException: test8.2.4 自定義異常盡管java內建的異常處理機制提供了豐富的異常類型,能夠滿足程序員的大部分需求,但有時候也需要程序員在程序中自定義異常類,根據(jù)自己的意愿來處理異常。自定義異常的一般格式為:class 異常類名 extends Exception 方法體;8.3.1 java中異常類的結構 在java語言中,異常有兩種分類:1)java.lang.Throwable類為所有對象的父類,
13、可以使用異常處理機制將這些對象拋出并捕獲。2)在Throwable類中定義方法來檢索與異常相關的錯誤信息,并打印顯示異常發(fā)生的棧跟蹤信息。它有Error和Exception兩個基本子類:錯誤(Error):JVM系統(tǒng)內部錯誤、資源耗盡等嚴重情況;異常(Exception):其它因編程錯誤或偶然的外在因素導致的一般性問題。Throwable類Error類Exception類 RuntimeException類ArithmeticException類IndexOutofBoundException類ArrayIndexOutofBoundsException類IoException類FileNot
14、FoundException類EOFException類在Java.lang包在Java.io包圖8-5 java中異常類的結構8.3.2 運行時異常運行時異常(RuntimeException)是指因設計或實現(xiàn)方式不當導致的問題。也可以說是程序員的原因導致的問題,本來可以避免發(fā)生的情況。這種異常的特點是java編譯器不會檢查它。由于沒有處理它,因此,當出現(xiàn)這類異常時,異常對象一直被傳遞到main()方法,程序將異常終止。如果采用了異常處理,異常將會被相應的程序執(zhí)行處理。表8-1給出了java語言預定義的Error異常子類,下面是運行時異常的常見子類,如表8-2 運行時異常子類:異常類名異常類
15、名描述描述ArithmeticException算數(shù)錯誤NullPointerException非法使用空引用ArrayIndexOutOfBoundsException數(shù)組下標越界ClassCastException非法強制轉換類型NegativeArraySizeException創(chuàng)建帶負維數(shù)大小的數(shù)組的嘗試ArrayStoreException數(shù)組元素賦值類型不兼容IndexOutOfBoundException某些類型索引越界NumberFormatException字符串到數(shù)字格式非法轉換SecurityException試圖違反安全性StringIndexOutOfBounds試圖
16、在字符串邊界之外索引UnsupportedOperationException遇到不支持的操作IllegalArgumentException調用方法的參數(shù)非法IllegalMonitorStateException非法監(jiān)控操作IllegalStateException環(huán)境或應用狀態(tài)不正確IllegalThreadStateException請求操作與當前線程狀態(tài)不兼容表8-2 運行時異常子類8.3.3 受檢查異常 Exception類中除了RuntimeException子類以外的類都是受檢查異常類。如表8-3 受檢查異常子類:異常類名異常類名描述描述ClassNotFoundExcepti
17、on找不到類CloneNotSupportedException試圖復制一個不能實現(xiàn)的Cloneable接口對象NoSuchMethodException請求的字段不存在NoSuchMethodException請求的方法不存在InterruptedException一個線程被另一個線程中斷IllAccessException對一個類的訪問被拒絕InstantiationException試圖創(chuàng)建一個抽象類或者抽象接口的對象【實例8-9】ExceptionTest.javaclass ExceptionCom extends Exception private static final lon
18、g serialVersionUID = 1L;ExceptionCom() super(自定義異常);public class ExceptionTest public void A1(int n) System.out.println(A1前面);A2(n);System.out.println(A1后面);public void A2(int n) System.out.println(A2前面);try System.out.println(try的前面);A3(n);/ 發(fā)生異常時不會輸出System.out.println(try的后面); catch (ExceptionCom e) System.err.println(e.getMessage(); finally System.out.println(無論是否發(fā)生異常);System.out.println(A2后面);publi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025產(chǎn)品加盟購銷合同
- 2025年超鈾元素及其提取設備合作協(xié)議書
- 醫(yī)療穿戴設備企業(yè)招聘協(xié)議模板
- 2025年粉體無篩分離設備項目發(fā)展計劃
- 2025上海勞動合同法
- 2024年繼承股權協(xié)議:父子間的股份承接
- 城市公園防水系統(tǒng)修繕合同
- 建筑工程保溫系統(tǒng)施工合同
- 醫(yī)療新技術項目監(jiān)管辦法
- 城市食品安全處方管理辦法
- 《金融工程原理-無套利均衡分析》筆記01
- 工程項目收尾管理辦法
- 閘門及啟閉機安裝專項施工方案
- 應征公民體格檢查表(征兵)
- 電力系統(tǒng)分析名詞解釋、簡答、模擬試卷
- 家具制造企業(yè)消防安全要求
- 鋼筋位置及保護層厚度檢測ppt課件
- 巖石堅固性和穩(wěn)定性分級表
- 控制網(wǎng)復測及控制點加密復測報告課件
- CNC程序控制管理辦法
- 案例思念休閑吧
評論
0/150
提交評論