Chapter12异常处理对于计算机程序来说,错误和异常情况都是不可避免的。Java提供了丰富的出错与异常理机制12-1异常的基本概念异常实际上是程序中错误导致中断了正常的指令流的一种事件。12-1-1为什么需要异常处理?在没有异常处理的语言中,我们必须使用if-else或switch等语句,配合想得到的错误状况来捕捉错误。因而也导致了程序运行效率低的情况。Java的异常处理机制恰好改变了这种缺点。它具有易于使用,可自行定义一场类,允许我们抛出异常,且不会脱慢运行速度等有点。12-1-2简单的异常范例//app12_1,下标值超出范围publicclassapp12_1{publicstaticvoidmain(Stringargs[]){intarr[]=newint[5];//容许5个元素arr[10]=7;//下标值超出容许范围System.out.println(endofmain()method!!);}}程序在编译时并不会产生错误,运行时会产生下列的错误信息:Exceptioninthread“main”java.lang.ArrayIndexOutOfBoudsExceptionatapp12_1.main(wew.java:7)原因在于下标值越界了,便由系统抛出ArrayIndexOutOfBoundsException这个种类的异常12-1-3异常处理(1)定义异常处理是用户程序以预定的方式响应运行错误和异常的能力。基本方式当一个方法引发一个异常后,可将异常抛出,由该方法的直接或者间接调用者处理异常。异常处理的语法try{要检查的程序语句;…}catch(异常类变量名称){一场发生时的处理语句;…}finally{一定会运行的程序代码;}try块catch块finally块异常处理的执行顺序1.try程序块发现异常并抛出“有异常类产生的对象”.2.catch块捕由try程序块抛出的异常,并做相应处理.3.无论是否有异常发生,最终都要执行finally块里的程序.由此我们便可绘出如图12-1所示的流程图try{}是否捕捉到例外?try{}是否捕捉到异常?执行catch区块里的叙述运行catch块里的语句与catch()里的例外相同?与catch()里的异常相同?true其它的叙述其他的语句falsefalse执行finally区块里的叙述运行finally块里的语句异常处理的范例1//app12_2,异常的处理publicclassapp12_2{publicstaticvoidmain(Stringargs[]){try//检查这个程序块的的程序代码{intarr[]=newint[5];arr[10]=7;}catch(ArrayIndexOutOfBoundsExceptione){System.out.println(indexoutofbound!!);}finally//这个块的程序代码一定会运行{System.out.println(thislineisalwaysexecuted!!);}如果抛出异常,便运行此快的程序代码System.out.println(endofmain()method!!);}}/*app12-2OUTPUT------------indexoutofbound!!thislineisalwaysexecuted!!endofmain()method!!-------------------------------*/异常处理范例2//app12_3,异常信息的选择publicclassapp12_3{publicstaticvoidmain(Stringargs[]){try{intarr[]=newint[5];arr[10]=7;}catch(ArrayIndexOfBoundsExceptione){System.out.println(“indexoutofbound!!”);System.out.println(“Exception=“+e);}System.out.println(“endofmain()method!!”);}}/*----------------------------------------------------------------------indexoutofbound!!Exception=java.lang.ArrayIndexOutOfBoundsExceptionendofmain()method----------------------------------------------------------------------*/app11_3OUTPUT12-1-4异常处理机制的回顾异常发生时,通常有两种处理方法:一种是交由java默认的常处理机制来处理;另一种是有用户自行编写的try-catch-finally来捕捉异常。下面是异常处理机制的流程图:发生异常程序执行程序运行是否自行处理例外?是否自行处理异常?交由Java预设的例外处理机制做处理,如app12_1交由Java默认的异常处理机制做处理,如app12_1撰写try-catch-finally处理例外,如app12_2编写try-catch-finally处理异常,如app12_2yesno12-2异常类的继承框架异常类可以分为两大类:java.lang.Excepton与java.lang.Error这两个类均继承自java.lang.Throwable类。下图为Throwabel类的继承关系图ThrowableThrowableErrorErrorExceptionExceptionRuntimeExceptionRuntimeExceptionIOExceptionIOExceptionIndexOutOfBoundsExceptionIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionArithmeticExceptionArithmeticExceptionStringIndexOutOfBoundsExceptionStringIndexOutOfBoundsException........................异常类的说明1.Error:由Java虚拟机生成并抛出,Java程序不做处理。2.RuntimeException(被0除等系统错误,数组下标超范围):由系统检测,用户的Java程序可不做处理,系统将它们交给缺省的异常处理程序。3.Exception(程序中的问题,可预知的):Java编译器要求Java程序必须捕获或声明所有的非运行时异常。12-3抛出异常throw-直接抛出异常直接抛出异常是在方法中用此关键字将异常抛出,不是出错产生,而是人为地抛出异常处理的语法Throw由异常类所产生的对象例:直接抛出异常//app12_4,在程序中抛出异常publicclassapp12_4publicstaticvoidmain(Stringargs[]){inta=4,b=0;try{if(b=0)threwnewArithmeticException();//抛出异常elseSystem.out.println(a+”/”+b+”=“+a/b);//若抛出,则运行此行}catch(ArithmeticExceptione){System.out.println(e+”throwed“);}}}/*app12-4OUTPUT------------------------------Java.lang.ArithmeticExceptionthrowed---------------------------------------------------------*/12-3-2指定方法抛出异常若方法内的程序代码可能会发生异常,且方法内有没有任何的try-catch-finally块来捕异常时则我们必须在声明方法时一并指明所有可能发生的异常,调用此方法的程序来捕捉异常。方法抛出异常的格式方法名称(参数…)throws异常1,…例:方法抛出异常//app12_6,方法抛出异常Publicclassapp12_6{publicstaticvoidadd(inta,intb)throwsArithmeticException{intc;c=a/b;System.out.println(a+”/”+”=“+c);}publicstaticvoidmain(Stringargs[]){try{add(4,0);}catch(ArithmeticExceptione){System.out.println(e+”throwed”);}}}/*app12_6OUTPUT-------------------------------------Java.lang.ArithmeticException:/byzerothrowed---------------------------------------------------------------*/例:从不同类的方法里抛出异常//app12_7,从不同类的方法里抛出异常ClassCtest{publicstaticvoidadd(inta,intb)throwsArithmeticException{intc=a/b;System.out.println(a+”/”+b”=“+c);}}publicclassapp12_7{publicstaticvoidmain(Stringargs[]){try{Ctest.aaa(4,0);}catch(ArithmeticExceptione){System.out.println(e+”throwed”);}}}/*app12_7OUTPUT------------------------------java.lang.ArithmeticException:/byzerothrowed----------------------------------------------------------------*/app12_7与app12_6颇为相似,不同之处add()方法是封装在Ctest类之内。Add()一样可以抛出ArithmeticException异常,在main()方法里一样定义了捕捉和处理异常的代码。12-4自己编写异常类1、可以通过扩展Exception类来创建异常类。扩充类象任何其他类一样包含构造方法、数据成员和方法。当实现自定义异常时使用throw和throws关键字。2、不是由Java系统监测到的异常(下标越界,被0除等),而是由用户自己定义的异常。3、用户定义的异常同样要用try--catch捕获,但必须由用户抛出thrownewMyException。4、异常是一个类,用户定义的异常必须继承自hrowable或Exception类,建议用Exception类。例子1://app12_8,类类型的变量的应用classCCircleExceptionextendsException//定义自己的异常类{}classCCircle//定义类CCircle{privatedoubleradius;publicvoidsetRadius(doubler)throwsCCircleException{if(r0){thrownewCCircleException();//抛出异常}elseradius=r;}publicvoidshow(){System.out.println(area=+3.14*radius*radius);}}publicclassapp12_8{publicstaticvoidmain(Stringargs[]){CCirclecir=newCCircle