资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,JAVA,语言程序设计,第五章 异常处理,5.1,异常类的层次,5.2,throws,抛出异常,5.3,throw,抛,出异常,5.4,异常处理,为什么要引入异常机制,当程序运行的时候,经常会由于各种不可避免的原因而产生错误。,一个好的程序应该可以自己处理这些错误,而不是使整个程序全部瘫痪。,Java,把运行中各种可能出现的错误都看作异常,并提供了异常处理的能力。,异常的几个概念,异常机制的过程:抛出异常捕捉异常,1 当出现了一些错误,方法都会产生一个,异常对象,,这个异常对象将交由运行系统来处理。此过程就称为,抛出(,throwing),异常,。,2 接着,运行系统开始寻找合适的处理方法,来处理这个异常。如果系统找到了一个适合的处理该异常方法,这一过程就叫,捕获异常,。,包括:系统抛出,用户自定义抛出,异常类的结构,Object,Throwable,Error,Exception,Object,RuntimeException,IOException,异常类常用的方法,1.,public Exception(),2. public Exception(String s):,该参数一般表示该异常对应的错误的描述,通过,public String,getMessage,(),即返回,s,3. public String,toString,():,返回描述当前异常对象信息的字符串,4.,public String,getMessage,(),:,返回描述当前异常对象信息的详细信息,5.,public void,printStackTrace,(),:,打印当前异常对象使用堆栈的轨迹,E,xception,类的构造方法,异常处理机制的语法支持,异常处理由,try/catch/finally,三个语句组成的:,try,包含可能出现异常的语句块,一个或多个,catch,块紧随,try,块,每个,catch,块通常处理指定类型的异常,finally,引导块紧随,catch,块后,主要用于清理现场(可有可无),注意:,finally,块总是执行,,catch,块不一定执行,格式:,try,.,catch( ExceptionName1 e ), .,catch( ExceptionName2 e ),.,finally,.,try-catch,异常处理机制:,当,try,体中发生了一个异常,,try-catch,语句就会自动在,try,体后面的各个,catch,语句中,找出与该异常类相匹配的参数,就执行包含这一参数的,catch,语句中的,Java,代码。,不论,try,块中是否发生了异常,是否执行过,catch,语句,都要执行,finally,语句,可以说是为异常处理事件提供的一个清理机制。,finally,语句可以说是为异常处理事件提供的一个清理机制,一般是用来关闭文件或释放其他的系统资源,作为,try-catch-finally,结构的一部分,可以没有,finally,语句,如果存在,finally,语句,,不论,try,块中是否发生了异常,是否执行过,catch,语句,都要执行,finally,语句。,带有,finally,子句的,try-catch-finally,语句的形式如下:,try, ,/,是正常执行的代码,可能产生异常,catch,(,异常类,1,e1), ,/,是异常类,1,的处理代码,catch,(,异常类,2,e2), ,/,是异常类2的处理代码,catch,(,异常类,n en), ,/,是异常类,n,的处理代码,finally, ,/,是,执行清除工作的语句,finally,子句,finally,子句,finally,子句具体的执行过程如下:,(1),try,块中的语句没有产生异常。,在这种情况下,,Java,首先执行,try,块中的所有的语句,然后执行,finally,子句中的代码,最后执行,trycatch.finally,块后面的语句;,(2),try,块中的语句产生了异常,而且此异常在方法内被捕获。,在这种情况下,,Java,首先执行,try,块中的语句,直到产生异常处,然后跳过此,try,块中剩下的语句,执行捕获此异常的,catch,子句的处理代码;然后执行,finally,子句中的代码;,(3),如果,catch,子句中没有重新抛出异常,,那么,Java,将执行,trycatchfinally,块后面的语句。如果在,catch,子句又重新,抛出了异常,那么,Java,将这个异常抛出给方法的调用者;,(4),try,块中产生了异常,而此异常在方法内没有被捕获。,在这种情况下,,Java,将执行,try,块中的代码直到产生异常,然后跳过,try,块中的代码而转去执行,finally,子句中的代码,最后将异常抛出给方法的调用者。,finally,字句,throw,自定义抛出语句,throw,异常类对象;,说明:,throw,之后必须接异常类(,Throwable,或其子类)的实例。,程序会在,throw,语句立即终止,其后的语句不再执行,抛出语句应在满足一定条件时执行(如与,if,连用),含有,throw,语句的方法,抛出的异常一般由调用者处理,throws,指定函数抛出的异常,方法内的代码有可能发生异常而,又不自己进行处理时,,就必须在声明方法时一并指出方法有可能发生的异常,以便该方法的调用者或系统的预设处理方法能够捕获并处理由方法抛出的异常。,声明格式:,返回类型 方法名(参数列表),throws,异常类列表, ,throws,抛出异常和方法说明联系在一起,是针对以下情况:,调用的方法抛出了异常;,检测到了错误并使用,throw,语句抛出异常;,程序代码有错误从而异常,如数组越界错误。,方法中出现的异常由,catch,语句捕获,进行处理。,由于异常使用起来非常方便,以至于在很多情况下可能会滥用异常。但是,使用异常处理会降低程序运行的速度,如果在程序中过多地使用异常处理,程序的执行速度会显著地降低。这里给出几点建议,来帮助掌握好使用异常处理的尺度。,(1),在可以使用简单的测试就能完成的检查中,不要使用异常来代替它。例如:,if,(ins!=null),/,使用,ins,引用对象, ,正确使用异常注意事项:,(2) 不要过细地使用异常。,最好不要到处使用异常,更不要在循环体内使用异常处理, 可以将它包裹在循环体外面。,(3) 不要捕获了一个异常而又不对它做任何的处理。,如下例所示:,try, /,正常执行的代码,catch,(Exception e) ,(4),将异常保留给方法的调用者是很好的做法。,对于有些异常,将其交给方法的调用者去处理是一种更好的处理办法。,正确使用异常注意事项:,正确使用异常注意事项:,(5)一个方法被覆盖时,覆盖它的方法必须扔出相同的异常或异常的子类。,(6)如果父类扔出多个异常,那么重写(覆盖)方法必须扔出那些异常的一个子集,也就是说不能扔出新的异常。,异常处理把,Java,程序各种可能出现的错误都看作异常,集中起来统一处理。程序员只需要说明何处理可能的出现异常,如何处理即可。,throws,抛出异常和方法说明联系在一起,是针对以下情况:调用的方法抛出了异常、检测到了错误并使用,throw,语句抛出异常、程序代码有错误从而异常。,try-catch,异常处理机制。当,try,体中发生了一个异常,,try-catch,语句就会自动在,try,体后面的各个,catch,语句中,找出与该异常类相匹配的参数,就执行包含这一参数的,catch,语句中的,java,代码,执行完,catch,语句后,程序恢复执行,但不会回到异常发生处理继续执行,而是执行,try-catch,结构后面的代码。,finally,语句为异常处理事件提供的一个清理机制。,小结:,1.,什么是异常?简述,Java,的异常处理机制。,2,.,系统定义的异常与用户自定义的异常有何不同?如何使用这两类异常?,3.,编写从键盘读入,10,个字符放入一个字符数组,并在屏幕上显示它们的程序,程序中处理数组越界异常。,习题,
展开阅读全文