第12講Java異常教學課件_第1頁
第12講Java異常教學課件_第2頁
第12講Java異常教學課件_第3頁
第12講Java異常教學課件_第4頁
第12講Java異常教學課件_第5頁
已閱讀5頁,還剩30頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

異常異常Java異常的概念和處理機制捕獲異常Java異常的分類已檢查異常的處理拋出異常自定義異常2020/12/102異常異常示例(ExTest) lisa bily kessy Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:3 atorg.broadengate.teach.j2se.exception.ExTest.main(ExTest.java:7)2020/12/103異常異常示例(ExTest)publicclassExTest{ publicstaticvoidmain(String[]args){ Stringfriends[]={"lisa","bily","kessy"}; for(inti=0;i<5;i++){ System.out.println(friends[i]); } System.out.println("\nthisistheend"); }}2020/12/104異常異常異常是在程序運行過程中發生的異常事件,比如除0溢出、數組越界、文件找不到等,這些事件的發生將阻止程序的正常運行。為了加強程序的魯棒性,程序設計時,必須考慮到可能發生的異常事件并做出相應的處理。什么是異常

正常情況之外的一種“異常”。在問題發生的時候,我們可能不知具體該如何解決,但肯定知道已不能不顧一切地繼續下去。此時,必須堅決地停下來,并由某人、某地指出發生了什么事情,以及該采取何種對策。由于要強制捕獲很多異常,開發者很難忽略他們的異常處理代碼。這些異常就是我們常說的已檢查異常(checked

exceptions)2020/12/105異常Java異常處理機制Java通過面向對象的方法來處理異常。Java程序的執行過程中如出現異常,會自動生成一個異常類對象,該異常對象將被提交給Java運行時系統,這個過程稱為拋出(throw)異常。運行時系統在方法的調用棧中查找,從生成例外的方法開始進行回朔,直到找到包含相應例外處理的方法為止,這一個過程稱為捕獲(catch)一個例外。

如果Java運行時系統找不到可以捕獲異常的方法,則運行時系統將終止,相應的Java程序也將退出。2020/12/106異常捕獲異常(例:ExCatchTest)publicstaticvoidmain(String[]args){ Stringfriends[]={"lisa","bily","kessy"}; try{ for(inti=0;i<5;i++){ System.out.println(friends[i]); } }catch(java.lang.ArrayIndexOutOfBoundsExceptione) { System.out.println("indexerr"); } System.out.println("\nthisistheend"); }2020/12/107異常捕獲異常

捕獲異常是通過try-catch-finally語句實現的。try{ ...... //可能產生違例的代碼}catch(ExceptionName1e){ ...... //當產生ExceptionName1型違例時的處置措施}catch(ExceptionName2e){...... //當產生ExceptionName2型違例時的處置措施}[finally{...... //無條件執行的語句 }]2020/12/108異常捕獲異常try捕獲違例的第一步是用try{…}語句塊選定捕獲違例的范圍。若位于一個方法內部,并“擲”出一個異常(或在這個方法內部調用的另一個方法產生了異常),那個方法就會在異常產生過程中退出。若不想離開方法,可在那個方法內部設置一個特殊的代碼塊,用它捕獲異常。這就叫作“try塊”,因為要在這個地方“嘗試”各種方法調用。try塊屬于一種普通的作用域,用一個try關鍵字開頭:try{//可能產生違例的代碼}catch在catch語句塊中是對違例對象進行處理的代碼,每個try語句塊可以伴隨一個或多個catch語句,用于處理可能產生的不同類型的違例對象。可能有許多catch塊,每一個都處理不同的異常。

捕獲例外的順序和catch語句的順序有關,當捕獲到一個例外時,剩下的catch語句就不再進行匹配。因此,在安排catch語句的順序時,首先應該捕獲最特殊的例外,然后再逐漸一般化。也就是一般先安排子類,再安排父類。生成的異常必須在某個地方中止。這個“地方”便是異常控制器或者異常控制模塊。而且針對想捕獲的每種異常類型,都必須有一個相應的異常控制器。異常控制器緊接在try塊后面,且用catch(捕獲)關鍵字標記2020/12/109異常捕獲所有違例捕獲所有違例catch(Exceptione){

……

}

這段代碼能捕獲任何異常,所以在實際使用時最好將其置于控制器列表的末尾,防止跟隨在后面的任何特殊異常控制器失效。2020/12/1010異常捕獲異常與其它對象一樣,可以訪問一個異常對象的成員變量或調用它的方法。getMessage()方法,用來得到有關異常事件的信息printStackTrace()用來跟蹤異常事件發生時執行堆棧的內容2020/12/1011異常finally(例:ExCatchTest2)捕獲例外的最后一步是通過finally語句為例外處理提供一個統一的出口,使得在控制流轉到程序的其它部分以前,能夠對程序的狀態作統一的管理。不論在try代碼塊中是否發生了異常事件,finally塊中的語句都會被執行。finally語句塊的最重要的作用應該是釋放申請的資源finally語句是任選的2020/12/1012異常異常分類2020/12/1013異常異常分類Error表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。Exception表示一種設計或實現問題,即如果程序運行正常,從不會發生的情況。(由程序錯誤導致的異常)例如:對負數開平方根空指針訪問錯誤的數據類型等Error類被認為是不能恢復的嚴重錯誤,如系統內部錯誤和資源耗盡錯誤等。不應該拋出這種類型的錯誤,而是讓程序中斷。

------不是程序員的責任Exception類定義可能遇到的輕微錯誤,分為派生自IOException類的異常和非派生自RuntimeException類的異常。可以寫代碼來處理異常并繼續程序執行,而不是讓程序中斷。

------是程序員的責任2020/12/1014異常異常分類Java編譯器要求Java程序必須捕獲或聲明拋出所有的已檢查異常,對未檢查異常可以不做處理。未檢查異常:unchecked派生于RuntimeException或Error的類的所有異常其他稱為已檢查異常checked

編譯器將核查是否為所有已檢查異常提供異常處理2020/12/1015異常捕獲已檢查異常(例:IoExTest1) fr=new(f); br=newBufferedReader(fr); do{ ss=ss+s+"\n"; s=br.readLine(); }while(s!=null); System.err.println("found:"+fname); if(br!=null)br.close();2020/12/1016異常捕獲已檢查異常(例:IoExTest1)UnhandledexceptiontypeUnhandledexceptiontypeIOExceptionUnhandledexceptiontypeIOException2020/12/1017異常捕獲已檢查異常(例:IoExTest2)try{ fr=new(f); br=newBufferedReader(fr); do{ ss=ss+s+"\n"; s=br.readLine(); }while(s!=null);}catch(e1){ System.err.println("found:"+fname);}catch(IOExceptione2){ e2.printStackTrace();}2020/12/1018異常特例try{//沒有catch而只有finally}finally{}try{}catch(Exceptione){}//只有catch而沒有finally2020/12/1019異常幾個異常舉例ArithmeticException:整數被0除,運算得出的結果。intI=12/0;NullPointerException:當對象沒被實例化時,訪問對象的屬性或方法的嘗試:Dated=null;System.out.println(d.toString());NegativeArraySizeException:創建帶負維數大小的數組的嘗試。ArrayIndexoutofBoundsException:訪問超過數組大小范圍的一個元素的嘗試。2020/12/1020異常拋出異常如果方法中的一個語句會產生一個沒有在相應的try/catch塊中處理的異常,那么該方法中止執行并將異常拋出到該方法的調用程序中。這個過程要一直延續到異常被處理。如果一直到main()中仍沒有被處理,那么該異常就中斷程序的執行。

2020/12/1021異常拋出異常總經理---main()部門經理---xxMethod()辦事員---xxMethod()上拋異常上拋異常程序中止問題解決不了,報告上級問題解決不了,報告上級問題解決不了,項目中止2020/12/1022異常聲明拋出異常(ExThrowsTest)publicstaticStringbufferedRead(BufferedReaderbr)throwsIOException{ Stringss=""; Strings=""; do{ ss=ss+s+"\n"; s=br.readLine(); }while(s!=null); returnss;}

重寫方法不能拋出比被重寫方法范圍更大的異常類型2020/12/1023異常創建并拋出異常拋出異常就是產生異常對象的過程,Java異常類對象除在程序執行過程中出現異常時由系統自動生成并拋出jvm,也可根據需要需要人工創建并拋出(系統異常其實由系統自己創建和拋出,代碼中不出現)(人工創建并拋出)首先要生成例外對象,然后通過throw語句實現拋出操作(提交給Java運行環境)。IOExceptione=newIOException();throwe;為創建自己的異常類,必須從一個現有的異常類型繼承——最好在含義上與新異常近似。

2020/12/1024異常自定義異常用戶定義異常是通過擴展Exception類來創建的。 publicclassCarExceptionextendsException{}它包含一個構造函數、幾個變量以及方法;創建并拋出自定義異常: CarExceptione=newCarException("Carisalreadyrunning---nastygrindingnoise!");e.setEngineRunning(true);throwe;2020/12/1025異常自定義異常綜合示例:例:CarException自定義異常類例:NewCar 抽象類例:Porsche 實現類classMyExceptionextendsException{publicMyException(){}publicMyException(Stringmsg){super(msg);}}2020/12/1026異常自定義異常publicclassInheriting{publicstaticvoidf()throwsMyException{System.out.println("ThrowingMyExceptionfromf()");thrownewMyException();}publicstaticvoidg()throwsMyException{System.out.println("ThrowingMyExceptionfromg()");thrownewMyException("Originateding()");}publicstaticvoidmain(String[]args){try{f();}catch(MyExceptione){e.printStackTrace();}try{g();}catch(MyExceptione){e.printStackTrace();}}}2020/12/1027異常方法覆蓋與異常子類的方法應該拋出范圍更小(更具體的)的異常子類的方法可以拋出被覆蓋方法相同的異常或其子類。2020/12/1028異常方法覆蓋與異常classTestExcpt5{ publicstaticvoidmain(String[]args){ }}interfaceMyInfc1{ voidaddPerson()throwsMyExcpt2; voiddelPerson()throwsMyExcpt2,MyExcpt3;}interfaceMyInfc11extendsMyInfc1{ //voidaddPerson()throwsMyExcpt2,MyExcpt3;//子類重寫的方法不能拋出比父類方法更多的異常,數量上的區別 voidaddPerson()throwsMyExcpt2; voiddelPerson()throwsMyExcpt2;//子類重寫的方法拋出比父類方法更少的異常}interfaceMyInfc12extendsMyInfc1{ //voidaddPerson()throwsMyExcpt1;//子類重寫的方法不能拋出父類方法的異常的父類方法,繼承關系上的區別 voiddelPerson()throwsMyExcpt2,MyExcpt31;}classMyExcpt1extendsException{ MyExcpt1(){ super(); } MyExcpt1(Stringmsg){ super(msg); }}classMyExcpt2extendsMyExcpt1{ MyExcpt2(){ super(); } MyExcpt2(Stringmsg){ super("MyExcpt2:"+msg); }}classMyExcpt3extendsMyExcpt1{ MyExcpt3(){ super(); } MyExcpt3(Stringmsg){ super("MyExcpt3:"+msg); }}classMyExcpt31extendsMyExcpt3{ MyExcpt31(){ super(); } MyExcpt31(Stringmsg){ super("MyExcpt31:"+msg); }}2020/12/1029異常異常與返回值publicinttt(){try{...return5;}catch(Exceptione){...return-1;}finally{return0;}return10;}2020/12/1030異常異常與返回值publicclassTestExcp2{ publicstaticvoidmain(String[]args){ inti=TestExcp2.tt(); System.out.println("result:"); System.out.println(i);} publicstaticinttt(){ try{ System.out.println("1"); //inti=Integer.parseInt("uu"); System.out.println("3"); return2; }catch(Exceptione){ //e.printStackTrace(); //e.getMessage(); System.out.println("4"); System.out.println("5"); return5; }f

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論