第6章_異常處理_第1頁
第6章_異常處理_第2頁
第6章_異常處理_第3頁
第6章_異常處理_第4頁
第6章_異常處理_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、JavaSEJavaSE知識圖解知識圖解JAVA發(fā)展歷程JAVA環(huán)境搭建基礎程序設計數(shù)據(jù)類型流程控制運算符數(shù)組面向對象編程類和對象屬性方法設計模式接口三大特性應用程序開發(fā)JDBC集合異常處理類庫多線程IO反射網(wǎng)絡連接OracleJAVA新特性Eclipse使用泛型枚舉裝箱/拆箱可變參數(shù)AnnotationJavaJava異常(異常(1 1) 在使用計算機語言進行項目開發(fā)的過程中,即使程序員把代碼寫得盡善盡美盡善盡美,在系統(tǒng)的運行過程中仍然會遇到一些問題,因為很多問題不是靠代碼能夠避免的,比如:客戶輸入數(shù)據(jù)的格式,讀取文件是否存在,網(wǎng)絡是否始終保持通暢等等。JavaJava異常(異常(2 2)l

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

3、在編寫程序時,就考慮到錯誤的檢測、錯誤消息的提示,以及錯誤的處理。l捕獲錯誤最理想的是在編譯期間編譯期間,但有的錯誤只有在運行運行時時才會發(fā)生。比如:除數(shù)為0,數(shù)組下標越界等分類:編譯時異常和運行時異常JavaJava異常類層次異常類層次ThrowableThrowableObjectObjectErrorErrorRuntimeExceptioRuntimeException nExceptioException nSQLExceptioSQLException nIOExceptionIOExceptionClassNotFoundExceptiClassNotFoundException

4、onAWTErrorAWTErrorThreadDeathThreadDeathNullPointerExceptiNullPointerExceptiononArithmeticExceptiArithmeticExceptiononClassCastExceptionClassCastExceptionArrayIndexOutOfBoundsEArrayIndexOutOfBoundsExceptionxception編譯編譯(checked)(checked)異異常常運行運行(unchecked)(unchecked)異異常常1.1.運行時異常運行時異常l 是指編譯器不要求強制處置的異

5、常。一般是指編程時的邏輯錯誤,是程序員應該積極避免其出現(xiàn)的異常。java.lang.RuntimeExceptionjava.lang.RuntimeException類及它的子類都是運行時異常。l 對于這類異常,可以不作處理,因為這類異常很普遍,若全處理可能會對程序的可讀性和運行效率產生影響。2.2.編譯時編譯時異常異常l 是指編譯器要求必須處置的異常。即程序在運行時由于外界因素造成的一般性異常。編譯器要求java程序必須捕獲或聲明所有編譯時異常。l 對于這類異常,如果程序不處理,可能會帶來意想不到的結果。JavaJava異常(異常(4 4)常見異常常見異常lj java.lang.Runt

6、imeExceptionava.lang.RuntimeException ClassCastExceptionClassCastExceptionArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionNullPointerExceptionNullPointerExceptionArithmeticExceptionArithmeticException。ljava.io.IOExeptionjava.io.IOExeptionFileNotFoundExceptionFileNotFoundExceptionEOFExcep

7、tionEOFExceptionlj java.lang.ClassNotFoundExceptionava.lang.ClassNotFoundExceptionlj java.lang.InterruptedExceptionava.lang.InterruptedExceptionljava.io.FileNotFoundExceptionjava.io.FileNotFoundExceptionljava.sql.SQLExceptionjava.sql.SQLExceptionJavaJava異常舉例異常舉例(1)(1)public class Test6_1 public stat

8、ic 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_1Test6_1編譯正確,運行結果:編譯正確,運行結果:java java Test6_1Test6_1lisalisabilybilykessykessyjava.lang.java.lang.ArrayIndexOutOfBoundsExceptionArrayI

9、ndexOutOfBoundsException at at Test6_1.main(Test6_1.java:5Test6_1.main(Test6_1.java:5) )Exception in thread mainException in thread mainJavaJava異常舉例異常舉例(2)(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.javaNu

10、llRef.java編譯正確,運行結果:編譯正確,運行結果:java java NullRefNullRefjava.lang.java.lang.NullPointerExceptionNullPointerExceptionat at NullRef.mainNullRef.main(NullRef.java:6)(NullRef.java:6)Exception in thread main Exception in thread main JavaJava異常舉例異常舉例(3)(3)public class DivideZero int x; public static void ma

11、in(String args) int y;DivideZero c=new DivideZero();y=3/c.x; System.out.println(“program ends ok!”); 程序程序DivideZero.javaDivideZero.java編譯正確,運行結果:編譯正確,運行結果:java java DivideZeroDivideZerojava.lang.java.lang.ArithmeticExceptionArithmeticException: / by zero: / by zeroat at DivideZero.mainDivideZero.mai

12、n(DivideZero.java:6)(DivideZero.java:6)Exception in thread main Exception in thread main JavaJava異常舉例異常舉例(4)(4)class Person public static void main(String args) Object obj = new Date();Person person;person = (Person)obj;System.out.println(person);程序程序Person.javaPerson.java編譯正確,運行結果:編譯正確,運行結果:java ja

13、va PersonPersonjava.langjava.lang. . java.lang.ClassCastExceptionjava.lang.ClassCastExceptionat at Person.mainPerson.main(Person.java:5)(Person.java:5)Exception in thread main Exception in thread main 異常處理機制(異常處理機制(1 1)在編寫程序時,經常要在可能出現(xiàn)錯誤的地方加上檢測的代碼,如進行x/y運算時,要檢測分母為0,數(shù)據(jù)為空,輸入的不是數(shù)據(jù)而是字符等。過多的分支會導致程序的代碼加長,可

14、讀性差。因此采用異常機制。JavaJava異常處理異常處理Java采用異常處理機制,將異常處理的程序代碼集中在一起,與正常的程序代碼分開,使得程序簡潔,并易于維護。異常處理機制(異常處理機制(2 2)lJava提供的是異常處理的抓拋模型抓拋模型。lJava程序的執(zhí)行過程中如出現(xiàn)異常,會生成一個異常類對象,該異常對象將被提交給Java運行時系統(tǒng),這個過程稱為拋出(throw)異常。l異常對象的生成由虛擬機自動生成自動生成:程序運行過程中,虛擬機檢測到程序發(fā)生了問題,如果在當前代碼中沒有找到相應的處理程序,就會在后臺自動創(chuàng)建一個對應異常類的實例對象并拋出自動拋出由開發(fā)人員手動創(chuàng)建手動創(chuàng)建:Exce

15、ption exception = new ClassCastException();創(chuàng)建好的異常對象不拋出對程序沒有任何影響,和創(chuàng)建一個普通對象一樣異常處理機制(異常處理機制(3 3)l如果一個方法內拋出異常,該異常對象會被拋給調用者方法中處理。如果異常沒有在調用者方法中處理,它繼續(xù)被拋給這個調用方法的上層方法。這個過程將一直繼續(xù)下去,直到異常被處理。這一過程稱為捕獲(catch)異常。l如果一個異常回到main()方法,并且main()也不處理,則程序運行終止。l程序員通常只能處理Exception,而對Error無能為力。異常處理機制(異常處理機制(4 4)異常處理是通過try-catc

16、h-finally語句實現(xiàn)的。try./可能產生異常的代碼catch( ExceptionName1 e )./當產生ExceptionName1型異常時的處置措施catch( ExceptionName2 e ). /當產生ExceptionName2型異常時的處置措施 finally. /無論是否發(fā)生異常,都無條件執(zhí)行的語句都無條件執(zhí)行的語句 捕獲異常捕獲異常(1)(1)ltry try 捕獲異常的第一步是用try語句塊選定捕獲異常的范圍,將可能出現(xiàn)異常的代碼放在try語句塊中。lcatch catch (Exceptiontype e)在catch語句塊中是對異常對象進行處理的代碼。每個

17、try語句塊可以伴隨一個或多個catch語句,用于處理可能產生的不同類型的異常對象。 如果明確知道產生的是何種異常,可以用該異常類作為catch的參數(shù);也可以用其父類作為catch的參數(shù)。 比如:可以用ArithmeticException類作為參數(shù)的地方,就可以用RuntimeException類作為參數(shù),或者用所有異常的父類Exception類作為參數(shù)。但不能是與ArithmeticException類無關的異常,如NullPointerException(catch中的語句將不會執(zhí)行)。捕獲異常捕獲異常(2)(2)l捕獲異常的有關信息:與其它對象一樣,可以訪問一個異常對象的成員變量或調用

18、它的方法。getMessage() 獲取異常信息,返回字符串printStackTrace() 獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置。返回值void。異常名稱異常名稱說明信息說明信息堆棧信息堆棧信息捕獲異常捕獲異常(3)(3)lfinallyfinally捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口,使得在控制流轉到程序的其它部分以前,能夠對程序的狀態(tài)作統(tǒng)一的管理。不論在try代碼塊中是否發(fā)生了異常事件,catch語句是否執(zhí)行,catch語句是否有異常,catch語句中是否有return,finally塊中的語句都會被執(zhí)行。finally語句和catch

19、語句是任選的捕獲異常捕獲異常(4)(4)異常處理舉例異常處理舉例(1)(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_

20、2Test6_2運行結果:運行結果:java java java6_2java6_2lisalisabilybilykessykessyindex index errerrthis is the endthis is the end異常處理舉例異常處理舉例(2)(2)public class DivideZero1 int x; public static void main(String args) int y;DivideZero1 c=new DivideZero1();tryy=3/c.x;catch(ArithmeticException e) System.out.println(

21、divide by zero error!);System.out.println(program ends ok!); 程序程序DivideZero1DivideZero1運行結果:運行結果:java DivideZero1java DivideZero1divide by zero error!divide by zero error!program ends ok!program ends ok!練習練習1 1l編寫一個類TestException,在main方法中使用try、catch、finally,要求:在try塊中,編寫被零除的代碼。在catch塊中,捕獲被零除所產生的異常,并且

22、打印異常信息在finally塊中,打印一條語句。體體 會會l捕獲和不捕獲異常,程序的運行有什么不同。l體會try語句塊中可能發(fā)生多個不同異常時的處理。l體會finally語句塊的使用。不捕獲異常時的情況不捕獲異常時的情況l前面使用的異常都是RuntimeException類或是它的子類,這些類的異常的特點是:即使沒有使用try和catch捕獲,Java自己也能捕獲,并且編譯通過 ( 但運行時會發(fā)生異常使得程序運行終止 )。l如果拋出的異常是IOException等類型的非運行時異常,則必須捕獲,否則編譯錯誤。也就是說,我們必須處理編譯時異常,將異常進行捕捉,轉化為運行時異常IOExceptio

23、nIOException異常處理舉例異常處理舉例(1)(1)import java.io.*;public class Test6_3 public static void main(String args) F i l e I n p u t S t r e a m i n = n e w FileInputStream(myfile.txt); int b;b = in.read(); while(b!= -1) System.out.print(char)b); b = in.read(); in.close(); IOExceptionIOException異常處理舉例異常處理舉例(2

24、)(2)import java.io.*;public class Test6_3 public static void main(String args)tryF i l e I n p u t S t r e a m i n = n e w FileInputStream(myfile.txt);int b;b = in.read();while(b!= -1) System.out.print(char)b);b = in.read();in.close();catch (IOException e) System.out.println(e);finally System.out.pr

25、intln( Its ok!); 練習練習2 2 捕獲和處理捕獲和處理IOExceptionIOException異常異常 編譯、運行應用程序Test6_3.java,體會java語言中異常的捕獲和處理機制。相關知識:FileInputStream類的成員方法read()的功能是每次從相應的(本地為ASCII碼編碼格式)文件中讀取一個字節(jié),并轉換成0255之間的int型整數(shù)返回,到達文件末尾時則返回-1。聲明拋出異常聲明拋出異常(1)(1)l聲明拋出異常是聲明拋出異常是JavaJava中處理異常的第二種方式中處理異常的第二種方式如果一個方法(中的語句執(zhí)行時)可能生成某種異常,但是并不能確定如何

26、處理這種異常,則此方法應顯示地聲明拋出異常,表明該方法將不對這些異常進行處理,而由該方法的調用者負責處理。在方法聲明中用throws語句可以聲明拋出異常的列表,throws后面的異常類型可以是方法中產生的異常類型,也可以是它的父類。l聲明拋出異常舉例:public void readFile(String file) throws FileNotFoundException / / 讀文件的操作可能產生讀文件的操作可能產生FileNotFoundExceptionFileNotFoundException類型的異常類型的異常FileInputStream fis = new FileInput

27、Stream(file); . 聲明拋出異常聲明拋出異常(2)(2)import java.io.*;public class Test6_4public 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();while(b!= -1) S

28、ystem.out.print(char)b);b = in.read();in.close();有可能找不到有可能找不到filePathfilePath指定的文件,所以拋指定的文件,所以拋出出FileNotFoundExceptionFileNotFoundException異常異常在方法頭部聲明拋出在方法頭部聲明拋出調用了一個聲明調用了一個聲明拋出非運行時異常的方法拋出非運行時異常的方法繼續(xù)向上拋,交給調繼續(xù)向上拋,交給調用者處理用者處理聲明拋出異常聲明拋出異常(3)(3)l方法體內可能拋出非運行時異常l調用聲明拋出非運行時異常的方法重寫方法聲明拋出異常的原則重寫方法聲明拋出異常的原則l重

29、寫方法不能拋出比被重寫方法范圍更大的異常類型。在多態(tài)的情況下,對methodA()方法的調用-異常的捕獲按父類聲明的異常處理。 public class A public void methodA() throws IOException public class B1 extends A public void methodA() throws FileNotFoundException public class B2 extends A public void methodA() throws Exception /報報錯錯 人工拋出異常人工拋出異常lJava異常類對象除在程序執(zhí)行過程中出

30、現(xiàn)異常時由系統(tǒng)自動生成并拋出,也可根據(jù)需要人工創(chuàng)建并拋出。首先要生成異常類對象,然后通過throw語句實現(xiàn)拋出操作(提交給Java運行環(huán)境)。IOExceptionIOException e = new e = new IOExceptionIOException();();throw e;throw e;可以拋出的異常必須是Throwable或其子類的實例。下面的語句在編譯時將會產生語法錯誤: throw new String(want to throw);創(chuàng)建用戶自定義異常類創(chuàng)建用戶自定義異常類l 一般地,用戶自定義異常類都是RuntimeException的子類。l 自定義異常類通常需要

31、編寫幾個重載的構造器。l 自定義的異常類對象通過throw拋出。l 自定義異常最重要的是異常類的名字,當異常出現(xiàn)時,可以根據(jù)名字判斷異常類型。創(chuàng)建用戶自定義異常類創(chuàng)建用戶自定義異常類用戶自定義異常類MyException,用于描述數(shù)據(jù)取值范圍錯誤信息。用戶自己的異常類必須繼承必須繼承現(xiàn)有的異常類。class MyException extends Exception static final long serialVersionUID = 1L;private int idnumber; public MyException(String message, int id) super(mess

32、age);this.idnumber = id; public int getId() return idnumber; 使用用戶自定義異常類使用用戶自定義異常類public class public class Test6_5Test6_5 public void public void registregist( (intint num) throws num) throws MyExceptionMyException if (num 0) if (num 0) throwthrow new new MyExceptionMyException(“(“人數(shù)為負值,不合理人數(shù)為負值,不合理

33、”, , 3 3););elseelse System.out.printlnSystem.out.println(登記人數(shù)登記人數(shù) + num ); + num ); public void manager() public void manager() try try registregist(100);(100); catch ( catch (MyExceptionMyException e) e) System.out.printSystem.out.print(登記失敗,出錯種類登記失敗,出錯種類+e.getIde.getId();(); System.out.printSystem.out.print(本次登記操作結束本次登記操作結束);); public static void main(String public static void main(String argsargs)Test6_5 Test6_5 t = new t = new Test6_5

溫馨提示

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

評論

0/150

提交評論