尚硅谷_宋紅康_第6章_異常處理.pptx_第1頁(yè)
尚硅谷_宋紅康_第6章_異常處理.pptx_第2頁(yè)
尚硅谷_宋紅康_第6章_異常處理.pptx_第3頁(yè)
尚硅谷_宋紅康_第6章_異常處理.pptx_第4頁(yè)
尚硅谷_宋紅康_第6章_異常處理.pptx_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第6章異常處理,講師:宋紅康 新浪微博:尚硅谷-宋紅康,JavaSE知識(shí)圖解,JAVA發(fā)展歷程,JAVA環(huán)境搭建,基礎(chǔ)程序設(shè)計(jì),數(shù)據(jù)類型,流程控制,運(yùn)算符,數(shù)組,面向?qū)ο缶幊?類和對(duì)象,屬性,方法,設(shè)計(jì)模式,接口,三大特性,應(yīng)用程序開(kāi)發(fā),JDBC,集合,異常處理,類庫(kù),多線程,IO,反射,網(wǎng)絡(luò),連接Oracle,JAVA新特性,Eclipse使用,泛型,枚舉,裝箱/拆箱,可變參數(shù),Annotation,Java異常(1),在使用計(jì)算機(jī)語(yǔ)言進(jìn)行項(xiàng)目開(kāi)發(fā)的過(guò)程中,即使程序員把代碼寫得盡善盡美,在系統(tǒng)的運(yùn)行過(guò)程中仍然會(huì)遇到一些問(wèn)題,因?yàn)楹芏鄦?wèn)題不是靠代碼能夠避免的,比如:客戶輸入數(shù)據(jù)的格式,讀取文件

2、是否存在,網(wǎng)絡(luò)是否始終保持通暢等等。,Java異常(2),異常:在Java語(yǔ)言中,將程序執(zhí)行中發(fā)生的不正常情況稱為“異?!薄?開(kāi)發(fā)過(guò)程中的語(yǔ)法錯(cuò)誤和邏輯錯(cuò)誤不是異常) Java程序在執(zhí)行過(guò)程中所發(fā)生的異常事件可分為兩類: Error: Java虛擬機(jī)無(wú)法解決的嚴(yán)重問(wèn)題。如:JVM系統(tǒng)內(nèi)部錯(cuò)誤、資源耗盡等嚴(yán)重情況。一般不編寫針對(duì)性的代碼進(jìn)行處理。 Exception: 其它因編程錯(cuò)誤或偶然的外在因素導(dǎo)致的一般性問(wèn)題,可以使用針對(duì)性的代碼進(jìn)行處理。例如: 空指針訪問(wèn) 試圖讀取不存在的文件 網(wǎng)絡(luò)連接中斷,Java異常(3),對(duì)于這些錯(cuò)誤,一般有兩種解決方法:一是遇到錯(cuò)誤就終止程序的運(yùn)行。另一種方法是

3、由程序員在編寫程序時(shí),就考慮到錯(cuò)誤的檢測(cè)、錯(cuò)誤消息的提示,以及錯(cuò)誤的處理。 捕獲錯(cuò)誤最理想的是在編譯期間,但有的錯(cuò)誤只有在運(yùn)行時(shí)才會(huì)發(fā)生。比如:除數(shù)為0,數(shù)組下標(biāo)越界等 分類:編譯時(shí)異常和運(yùn)行時(shí)異常,Java異常類層次,Throwable,Object,Error,RuntimeException,Exception,SQLException,IOException,ClassNotFoundException,AWTError,ThreadDeath,NullPointerException,ArithmeticException,ClassCastException,ArrayIndexO

4、utOfBoundsException,編譯(checked)異常,運(yùn)行(unchecked)異常,1.運(yùn)行時(shí)異常 是指編譯器不要求強(qiáng)制處置的異常。一般是指編程時(shí)的邏輯錯(cuò)誤,是程序員應(yīng)該積極避免其出現(xiàn)的異常。java.lang.RuntimeException類及它的子類都是運(yùn)行時(shí)異常。 對(duì)于這類異常,可以不作處理,因?yàn)檫@類異常很普遍,若全處理可能會(huì)對(duì)程序的可讀性和運(yùn)行效率產(chǎn)生影響。 2.編譯時(shí)異常 是指編譯器要求必須處置的異常。即程序在運(yùn)行時(shí)由于外界因素造成的一般性異常。編譯器要求java程序必須捕獲或聲明所有編譯時(shí)異常。 對(duì)于這類異常,如果程序不處理,可能會(huì)帶來(lái)意想不到的結(jié)果。,Java異

5、常(4),常見(jiàn)異常,java.lang.RuntimeException ClassCastException ArrayIndexOutOfBoundsException NullPointerException ArithmeticException 。 java.io.IOExeption FileNotFoundException EOFException java.lang.ClassNotFoundException java.lang.InterruptedException java.io.FileNotFoundException java.sql.SQLException,

6、Java異常舉例(1),public class Test6_1 public static void main(String args) String friends=lisa,bily,kessy; for(int i=0;i5;i+) System.out.println(friendsi); /friends4? System.out.println(nthis is the end); ,程序Test6_1編譯正確,運(yùn)行結(jié)果:java Test6_1 lisa bily kessy java.lang.ArrayIndexOutOfBoundsException at Test6_1

7、.main(Test6_1.java:5) Exception in thread main,Java異常舉例(2),public class NullRef int i=1; public static void main(String args) NullRef t=new NullRef(); t=null; System.out.println(t.i); ,程序NullRef.java編譯正確,運(yùn)行結(jié)果:java NullRef java.lang.NullPointerException at NullRef.main(NullRef.java:6) Exception in th

8、read main,Java異常舉例(3),public class DivideZero int x; public static void main(String args) int y; DivideZero c=new DivideZero(); y=3/c.x; System.out.println(“program ends ok!”); ,程序DivideZero.java編譯正確,運(yùn)行結(jié)果:java DivideZero java.lang.ArithmeticException: / by zero at DivideZero.main(DivideZero.java:6)

9、Exception in thread main,Java異常舉例(4),class Person public static void main(String args) Object obj = new Date(); Person person; person = (Person)obj; System.out.println(person); ,程序Person.java編譯正確,運(yùn)行結(jié)果:java Person java.lang. java.lang.ClassCastException at Person.main(Person.java:5) Exception in thre

10、ad main,異常處理機(jī)制(1),在編寫程序時(shí),經(jīng)常要在可能出現(xiàn)錯(cuò)誤的地方加上檢測(cè)的代碼,如進(jìn)行x/y運(yùn)算時(shí),要檢測(cè)分母為0,數(shù)據(jù)為空,輸入的不是數(shù)據(jù)而是字符等。過(guò)多的分支會(huì)導(dǎo)致程序的代碼加長(zhǎng),可讀性差。因此采用異常機(jī)制。 Java異常處理 Java采用異常處理機(jī)制,將異常處理的程序代碼集中在一起,與正常的程序代碼分開(kāi),使得程序簡(jiǎn)潔,并易于維護(hù)。,異常處理機(jī)制(2),Java提供的是異常處理的抓拋模型。 Java程序的執(zhí)行過(guò)程中如出現(xiàn)異常,會(huì)生成一個(gè)異常類對(duì)象,該異常對(duì)象將被提交給Java運(yùn)行時(shí)系統(tǒng),這個(gè)過(guò)程稱為拋出(throw)異常。 異常對(duì)象的生成 由虛擬機(jī)自動(dòng)生成:程序運(yùn)行過(guò)程中,虛擬

11、機(jī)檢測(cè)到程序發(fā)生了問(wèn)題,如果在當(dāng)前代碼中沒(méi)有找到相應(yīng)的處理程序,就會(huì)在后臺(tái)自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)異常類的實(shí)例對(duì)象并拋出自動(dòng)拋出 由開(kāi)發(fā)人員手動(dòng)創(chuàng)建:Exception exception = new ClassCastException();創(chuàng)建好的異常對(duì)象不拋出對(duì)程序沒(méi)有任何影響,和創(chuàng)建一個(gè)普通對(duì)象一樣,異常處理機(jī)制(3),如果一個(gè)方法內(nèi)拋出異常,該異常對(duì)象會(huì)被拋給調(diào)用者方法中處理。如果異常沒(méi)有在調(diào)用者方法中處理,它繼續(xù)被拋給這個(gè)調(diào)用方法的上層方法。這個(gè)過(guò)程將一直繼續(xù)下去,直到異常被處理。這一過(guò)程稱為捕獲(catch)異常。 如果一個(gè)異常回到main()方法,并且main()也不處理,則程序運(yùn)行終

12、止。 程序員通常只能處理Exception,而對(duì)Error無(wú)能為力。,異常處理是通過(guò)try-catch-finally語(yǔ)句實(shí)現(xiàn)的。 try ./可能產(chǎn)生異常的代碼 catch( ExceptionName1 e ) ./當(dāng)產(chǎn)生ExceptionName1型異常時(shí)的處置措施 catch( ExceptionName2 e ) . /當(dāng)產(chǎn)生ExceptionName2型異常時(shí)的處置措施 finally . /無(wú)論是否發(fā)生異常,都無(wú)條件執(zhí)行的語(yǔ)句 ,異常處理機(jī)制(4),捕獲異常(1),try 捕獲異常的第一步是用try語(yǔ)句塊選定捕獲異常的范圍,將可能出現(xiàn)異常的代碼放在try語(yǔ)句塊中。 catch (

13、Exceptiontype e) 在catch語(yǔ)句塊中是對(duì)異常對(duì)象進(jìn)行處理的代碼。每個(gè)try語(yǔ)句塊可以伴隨一個(gè)或多個(gè)catch語(yǔ)句,用于處理可能產(chǎn)生的不同類型的異常對(duì)象。,如果明確知道產(chǎn)生的是何種異常,可以用該異常類作為catch的參數(shù);也可以用其父類作為catch的參數(shù)。 比如:可以用ArithmeticException類作為參數(shù)的地方,就可以用RuntimeException類作為參數(shù),或者用所有異常的父類Exception類作為參數(shù)。但不能是與ArithmeticException類無(wú)關(guān)的異常,如NullPointerException(catch中的語(yǔ)句將不會(huì)執(zhí)行)。,捕獲異常(2)

14、,捕獲異常的有關(guān)信息: 與其它對(duì)象一樣,可以訪問(wèn)一個(gè)異常對(duì)象的成員變量或調(diào)用它的方法。 getMessage() 獲取異常信息,返回字符串 printStackTrace() 獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。,堆棧信息,捕獲異常(3),finally 捕獲異常的最后一步是通過(guò)finally語(yǔ)句為異常處理提供一個(gè)統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。 不論在try代碼塊中是否發(fā)生了異常事件,catch語(yǔ)句是否執(zhí)行,catch語(yǔ)句是否有異常,catch語(yǔ)句中是否有return,finally塊中的語(yǔ)句都會(huì)被執(zhí)行。 fina

15、lly語(yǔ)句和catch語(yǔ)句是任選的,捕獲異常(4),異常處理舉例(1),public class Test6_2 public static void main(String args) String friends=lisa,bily,kessy; try for(int i=0;i5;i+) System.out.println(friendsi); catch(ArrayIndexOutOfBoundsException e) System.out.println(index err); System.out.println(nthis is the end); ,程序Test6_2運(yùn)行

16、結(jié)果:java java6_2 lisa bily kessy index err this is the end,異常處理舉例(2),public class DivideZero1 int x; public static void main(String args) int y; DivideZero1 c=new DivideZero1(); try y=3/c.x; catch(ArithmeticException e) System.out.println(divide by zero error!); System.out.println(program ends ok!);

17、,程序DivideZero1運(yùn)行結(jié)果:java DivideZero1 divide by zero error! program ends ok!,練習(xí)1,編寫一個(gè)類TestException,在main方法中使用try、catch、finally,要求: 在try塊中,編寫被零除的代碼。 在catch塊中,捕獲被零除所產(chǎn)生的異常,并且打印異常信息 在finally塊中,打印一條語(yǔ)句。,體 會(huì),捕獲和不捕獲異常,程序的運(yùn)行有什么不同。 體會(huì)try語(yǔ)句塊中可能發(fā)生多個(gè)不同異常時(shí)的處理。 體會(huì)finally語(yǔ)句塊的使用。,不捕獲異常時(shí)的情況,前面使用的異常都是RuntimeException類或

18、是它的子類,這些類的異常的特點(diǎn)是: 即使沒(méi)有使用try和catch捕獲,Java自己也能捕獲,并且編譯通過(guò) ( 但運(yùn)行時(shí)會(huì)發(fā)生異常使得程序運(yùn)行終止 )。 如果拋出的異常是IOException等類型的非運(yùn)行時(shí)異常,則必須捕獲,否則編譯錯(cuò)誤。也就是說(shuō),我們必須處理編譯時(shí)異常,將異常進(jìn)行捕捉,轉(zhuǎn)化為運(yùn)行時(shí)異常,IOException異常處理舉例(1),import java.io.*; public class Test6_3 public static void main(String args) FileInputStream in=new FileInputStream(myfile.txt

19、); int b; b = in.read(); while(b!= -1) System.out.print(char)b); b = in.read(); in.close(); ,IOException異常處理舉例(2),import java.io.*; public class Test6_3 public static void main(String args) try FileInputStream in=new FileInputStream(myfile.txt); int b; b = in.read(); while(b!= -1) System.out.print(c

20、har)b); b = in.read(); in.close(); catch (IOException e) System.out.println(e); finally System.out.println( Its ok!); ,練習(xí)2 捕獲和處理IOException異常,編譯、運(yùn)行應(yīng)用程序Test6_3.java,體會(huì)java語(yǔ)言中異常的捕獲和處理機(jī)制。 相關(guān)知識(shí):FileInputStream類的成員方法read()的功能是每次從相應(yīng)的(本地為ASCII碼編碼格式)文件中讀取一個(gè)字節(jié),并轉(zhuǎn)換成0255之間的int型整數(shù)返回,到達(dá)文件末尾時(shí)則返回-1。,聲明拋出異常(1),聲明拋出

21、異常是Java中處理異常的第二種方式 如果一個(gè)方法(中的語(yǔ)句執(zhí)行時(shí))可能生成某種異常,但是并不能確定如何處理這種異常,則此方法應(yīng)顯示地聲明拋出異常,表明該方法將不對(duì)這些異常進(jìn)行處理,而由該方法的調(diào)用者負(fù)責(zé)處理。 在方法聲明中用throws語(yǔ)句可以聲明拋出異常的列表,throws后面的異常類型可以是方法中產(chǎn)生的異常類型,也可以是它的父類。 聲明拋出異常舉例: public void readFile(String file) throws FileNotFoundException / 讀文件的操作可能產(chǎn)生FileNotFoundException類型的異常 FileInputStream fi

22、s = new FileInputStream(file); . ,聲明拋出異常(2),import java.io.*; public class Test6_4 public static void main(String args) Test6_4 t = new Test6_4(); try t.readFile(); catch(IOException e) public void readFile() throws IOException FileInputStream in=new FileInputStream(myfile.txt); int b; b = in.read()

23、; while(b!= -1) System.out.print(char)b); b = in.read(); in.close(); ,方法體內(nèi)可能拋出非運(yùn)行時(shí)異常 調(diào)用聲明拋出非運(yùn)行時(shí)異常的方法,聲明拋出異常(3),重寫方法聲明拋出異常的原則,重寫方法不能拋出比被重寫方法范圍更大的異常類型。在多態(tài)的情況下,對(duì)methodA()方法的調(diào)用-異常的捕獲按父類聲明的異常處理。,public class A public void methodA() throws IOException public class B1 extends A public void methodA() throws

24、 FileNotFoundException public class B2 extends A public void methodA() throws Exception /報(bào)錯(cuò) ,人工拋出異常,Java異常類對(duì)象除在程序執(zhí)行過(guò)程中出現(xiàn)異常時(shí)由系統(tǒng)自動(dòng)生成并拋出,也可根據(jù)需要人工創(chuàng)建并拋出。 首先要生成異常類對(duì)象,然后通過(guò)throw語(yǔ)句實(shí)現(xiàn)拋出操作(提交給Java運(yùn)行環(huán)境)。 IOException e = new IOException(); throw e; 可以拋出的異常必須是Throwable或其子類的實(shí)例。下面的語(yǔ)句在編譯時(shí)將會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤: throw new String(w

25、ant to throw);,創(chuàng)建用戶自定義異常類,一般地,用戶自定義異常類都是RuntimeException的子類。 自定義異常類通常需要編寫幾個(gè)重載的構(gòu)造器。 自定義的異常類對(duì)象通過(guò)throw拋出。 自定義異常最重要的是異常類的名字,當(dāng)異常出現(xiàn)時(shí),可以根據(jù)名字判斷異常類型。,創(chuàng)建用戶自定義異常類,用戶自定義異常類MyException,用于描述數(shù)據(jù)取值范圍錯(cuò)誤信息。用戶自己的異常類必須繼承現(xiàn)有的異常類。 class MyException extends Exception static final long serialVersionUID = 1L; private int idnu

26、mber; public MyException(String message, int id) super(message); this.idnumber = id; public int getId() return idnumber; ,使用用戶自定義異常類,public class Test6_5 public void regist(int num) throws MyException if (num 0) throw new MyException(“人數(shù)為負(fù)值,不合理”, 3); else System.out.println(登記人數(shù) + num ); public void manager() try regist(100); catch (MyException e) System.out.print(登記失敗,出錯(cuò)種類+e.getId(); System.out.print(本次登記操作結(jié)束); public static void main(String args) Test6_5 t = new Test6_5(); t.manager(); ,異常處理5個(gè)關(guān)鍵字,捕獲異常,拋出異常,聲明異常,try,catch,finally,執(zhí)行可能產(chǎn)生異常的代碼,捕獲異常,無(wú)論是否發(fā)生異常

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論