11.异常和异常类2.异常处理3.创建异常第九章异常处理2软件程序肯定会发生错误/问题从外部问题(硬盘、网络故障等)到编程错误(数组越界、引用空对象等)致命错误内存空间不足等错误(Error)导致程序异常中断程序不能简单地恢复执行非致命错误数组越界等异常(Exception)导致程序中断执行程序在修正后可恢复执行异常(Exception)3Java语言中已定义或用户定义的某个异常类的对象一个异常类代表一种异常事件Java语言利用异常来使程序获得处理错误的能力(error-handling)异常事件(ExceptionalEvent)每当Java程序运行过程中发生了一个可识别的运行错误时,系统都会产生一个相应的该异常类的对象,即产生一个该错误的异常即“抛出异常”,运行系统“捕获”该异常并交由程序代码处理。异常4Java语言中用来处理异常的类异常类的方法构造方法publicException()publicException(Strings)常用方法publicStringtoString()publicStringgetMessage()publicvoidprintStackTrace()异常类5对异常的定义Java语言中定义的异常类:IOException/NullPointerException详细定义见Java文档中各个包的ExceptionSummary用户定义自已所需的异常类,描述程序中出现的异常结果第10讲异常(Exception)classjava.lang.Throwableclassjava.lang.Error(严重的问题,但不需程序捕捉的错误)classjava.lang.LinkageError......classjava.lang.VirtualMachineErrorclassjava.lang.InternalErrorclassjava.lang.OutOfMemoryError......classjava.lang.Exception(程序应该捕捉的错误)classjava.lang.ClassNotFoundExceptionclassjava.lang.RuntimeException(JVM正常运行时抛出的错误)classjava.lang.ArithmeticException......classjava.io.IOExceptionclassjava.awt.AWTExceptionclassjava.sql.SQLException......6运行时异常:程序运行时自动对某些错误作出反应而产生的,不处理也可以通过编译、但运行时才产生。这类异常应该通过调试尽量避免,而不去捕获。如:ArithmeticException、NullPointerException、IndexOutOfBoundsException、ClassCastException7非运行时异常:在程序运行过程中由环境原因造成的如I/O异常,如网络地址打不开、文件未找到等,这类异常就必须捕获,否则编译通不过。其中异常处理中经常要做的就是I/O异常的处理。程序对错误与异常的处理方式有三种:1、程序不能处理的错误2、程序应避免而可以不去捕获的运行时异常3、必须捕获的非运行时异常81.异常和异常类2.异常处理3.创建异常第六章异常处理9当一个Java程序的方法产生一个错误,该方法创造一个异常对象并将其交给运行系统InJavaterminology,creatinganexceptionobjectandhandingittotheruntimesystemiscalledthrowinganexception(抛出异常)运行系统从错误发生处开始寻找处理错误的程序段Theexceptionhandlerchosenissaidtocatchtheexception(捕获异常)捕获异常的过程可以沿方法调用的逆向顺序寻找异常处理10异常处理器(exceptionhandler)trycatchfinally异常的抛出(throw)异常处理111】异常的产生下面通过一个例子来看一下异常从产生到捕获并处理的过程.122020/2/2912当一个异常类的对象被捕获或接收后,用户程序就会发生流程跳转,系统终止当前的流程而跳转到专门的异常处理语句块,或直接跳出当前程序和java虚拟机回到操作系统。132020/2/2913在Java的异常处理机制中,提供了try-catch-finally语句来捕获和处理一个或多个异常,其语法格式如下:try{要检查的语句序列}catch(异常类名形参对象名){异常发生时的处理语句序列}finally{一定会运行的语句序列}142020/2/2914catch块紧跟在try块的后面,用来接收try块可能产生的异常,一个catch语句块通常会用同样方式来处理它所接收到的所有异常,但是实际上一个try块可能产生多种不同的异常,如果希望能采取不同的方法来处理这些不同的异常,就需要使用多异常处理机制。152020/2/2915【例9.2】使用try-catch-finally语句对例9.1中产生的异常进行捕获与处理。//app9_2.java异常的捕获与处理publicclassapp9_2{publicstaticvoidmain(Stringargs[]){inti;inta[]={1,2,3,4};for(i=0;i5;i++){try{System.out.print(“a[”+i+”]/”+i+”=”+(a[i]/i));}catch(ArrayIndexOutOfBoundsExceptione){System.out.print(“捕获到了数组下标越界异常”);}162020/2/29【例9.2】续catch(ArithmeticExceptione){System.out.print(“异常类名称是:”+e);//显示异常信息}catch(Exceptione){System.out.println(“捕获”+e.getMessage()+”异常!”);//显示异常信息}finally{System.out.println(“finallyi=”+i);}}System.out.println(“继续!!”);}}172020/2/2917程序运行结果为:异常类名称是:java.lang.ArithmeticException:/byzerofinallyi=0a[1]/1=2finallyi=1a[2]/2=1finallyi=2a[3]/3=1finallyi=3捕获到了数组下标越界异常finallyi=4继续!!18异常处理器(exceptionhandler)try程序块构造一个异常处理器,封装一些抛出异常的语句try{Java语句块;//指一个或多个抛出异常的Java语句}异常(Exception)classTest{publicstaticvoidmain(Stringargs[]){charc=(char)System.in.read();System.out.println(c);}}importjava.io.IOException;classTest{publicstaticvoidmain(Stringargs[]){try{charc=(char)System.in.read();System.out.println(c);}catch(IOExceptione){System.out.println(e);}}}一个try语句必须带有至少一个catch语句块或一个finally语句块19异常处理器(exceptionhandler)try语句块定义了异常处理器的范围catch语句块捕捉try语句块抛出的异常try{//Codethatmightgenerateexceptions}catch(Type1id1){//HandleexceptionsofType1}catch(Type2id2){//HandleexceptionsofType2}catch(Type3id3){//HandleexceptionsofType3}//etc...异常处理importjava.io.IOException;classTest{publicstaticvoidmain(Stringargs[]){try{charc=(char)System.in.read();System.out.println(c);}catch(IOExceptione){System.out.println(e);}}}try{...}catch(ArrayIndexOutOfBoundsExceptione){System.out.println(e);}catch(IOExceptione){System.out.println(e);}20异常处理器(exceptionhandler)finally语句块There’softensomepieceofcodethatyouwanttoexecutewhetherornotanexceptionisthrownwithinatryblock.finally语句块在异常处理中是必须执行的语句块清理现场关闭打开的文件关闭网络连接异常处理try{//Theguardedregion:Dangerousactivities//thatmightthrowA,B,orC}catch(Aa1){//HandlerforsituationA}catch(Bb1){//HandlerforsituationB}catch(Cc1){//HandlerforsituationC}finally{//Activitiesthathappeneverytime}21异常的抛出在一个方法中,抛出异常,同时捕捉当有多个方法调用时,由特定(适当)的方法捕捉异常被调用的方法主动抛出异常(throws)异常处理importjava.io.IOException;classTest{staticchargetChar()throwsIOException{charc=(char)System.in.read();returnc;}publicstaticvoidmain(Stringargs[]){try{charc=getChar();System.out.println(c);}catch(IOExceptione){System.out.println(e);}}}22异常的抛出主动抛出异常异常处理voidparseObj(Strings)throwsNullPointerException{if(s==null)thrownewNullPointerException();……;}23异常的抛出由方法抛出异常交系统处理:对于程序中无法处理必须交由系统处理的异常,由于系统直接调用的是主方法main(),所以可以在主方法中使用throws子句声明抛出异常交由系统处理。异常处理importjava.io.*;publicclassTest{publicstaticvoidmain(Stringargs[])throwsIOException{FileInputStreamfis=newFileInputStream(“autoexec.bat”);}}24IOException类的异常处理直接由主方法main()抛出异常,让JAVA默认的异常处理机制来处理。在程序代码内编写try-catch语句捕获异常,如此则不用指定main()throwsIOException抛出异常了。既在main()方法的后面使用throws抛出异常,也可以在程序中使用try-catch捕获异常。251.异常和异常类2.异常处理3.创建异常第