《java概述课件13异常处理.ppt》由会员分享,可在线阅读,更多相关《java概述课件13异常处理.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第13章 异常处理2引言当程序运行遇到运行时错误,该程序将非正常终止。怎样处理运行时错误,使得该程序可以继续运行或平稳终止?这是本章中将要讨论的主题。3学习目标F了解异常和异常处理的概况(13.2).F探究使用异常处理的优点(13.3).F区别异常的类型:Error(错误,致命的)和Exception(异常,非致命的)以及必检和免检异常(13.4).F在方法头中声明异常(13.5.1).F在方法中抛出异常(13.5.2).F编写try-catch块处理异常(13.5.3).F解释异常是如何传播的(13.5.3).F在 try-catch块中使用finally子句(13.6).F只为非预期错误
2、使用异常(13.7).F在catch块中重新抛出异常(13.8).F创建链式异常(13.9).F定义自定制的异常类(13.10).4异常处理概述QuotientRunQuotientWithIfRunQuotientWithExceptionRun演示运行时错误用if语句排除该错误用异常处理该问题5异常的优势QuotientWithMethodRun现在我们可以看到用异常处理的优势,它能使方法抛出一个异常给它的调用者如果没有这种能力,那么被调用的方法就必须自己处理异常或者终止该程序如果在被调用的方法里发生运行时错误,又怎么办?6处理输入不匹配异常InputMismatchExceptionIn
3、putMismatchExceptionDemoRun通过处理输入不匹配异常InputMismatchException,我们的程序将会一直请求输入直到输入正确为止。7异常类型8系统错误系统错误系统错误(error)由由JVM抛出,并表示为抛出,并表示为Error类。类。Error类表示类表示内部系统错误,这种错内部系统错误,这种错误很少发生。如果不幸误很少发生。如果不幸发生了的话,我们几乎发生了的话,我们几乎不能做什么来补救,只不能做什么来补救,只能通知用户并试图尽量能通知用户并试图尽量稳妥地终止程序。稳妥地终止程序。9异常异常异常(Exception)描述描述由于程序和外部环境由于程序和外
4、部环境所引起的错误,这些所引起的错误,这些错误可被程序所捕获错误可被程序所捕获并处理。并处理。10运行时异常运行时异常运行时异常RuntimeException是由是由于程序错误所引起,比于程序错误所引起,比如错误的造型、访问越如错误的造型、访问越界的数组以及数字错误界的数组以及数字错误11必检异常与免检异常RuntimeException,Error和他们的子类都称为免检异常其他异常被称为必检异常,意思是指编译器会强制程序员检查并处理他们12免检异常在大多数情况下,免检异常都会反映出程序有不可恢复的逻辑错误。例如:如果通过一个引用变量访问一个对象之前未给该对象赋值,就会抛出空指针异常Null
5、PointerException;如果访问一个数组的越界元素,就会抛出下标越界异常IndexOutOfBoundsException。这些都是程序中必须纠正的逻辑错误。免检异常可能在程序的任何一个地方出现。为了避免过多地使用try-catch块,Java语言不允许编写代码捕获或声明免检异常。13免检异常免检异常免检异常14声明、抛出和捕获异常15声明异常F每个方法都必须声明它可能抛出的必检异常,称为声明异常,如:public void myMethod()throws IOException或public void myMethod()throws IOException,OtherExcep
6、tion16抛出异常F当程序检测到错误时,程序可以创建一个恰当的异常类型的实例并抛出它,这就称为抛出异常,如:throw new TheException();或TheException ex=new TheException();throw ex;17抛出异常例子/*Set a new radius*/public void setRadius(double newRadius)throws IllegalArgumentExceptionthrows IllegalArgumentException if(newRadius=0)radius=newRadius;else throw ne
7、w IllegalArgumentException(Radius cannot be negative);18捕获异常try/Statements that may throw exceptions statements;catch(Exception1 exVar1)handler for exception1;catch(Exception2 exVar2)handler for exception2;.catch(ExceptionN exVar3)handler for exceptionN;19捕获异常例子20捕获、声明必检异常Java强迫程序员处理必检异常。如果方法声明了一个必检
8、异常,就必须在try-catch块中调用,或者在调用方法中声明要抛出异常。例如,假定方法P1调用P2,而P2可能会抛出一个必检异常。那么代码必须写成下述格式21例:声明,抛出,并捕获异常F本示例修改了第8章所定义的Circle类的setRadius方法,来演示怎样声明、抛出和捕获异常。F如果半径是负数,新的setRadius方法将抛出一个异常。TestCircleWithExceptionRunCircleWithException22重新抛出异常try statements;catch(TheException ex)在退出以前执行一些操作;throw ex;23 finally 语句try
9、 statements;catch(TheException ex)handling ex;finally finalStatements;24跟踪程序的执行try statements;catch(TheException ex)handling ex;finally finalStatements;Next statement;假设执行这些语句不会发生异常25跟踪程序的执行try statements;catch(TheException ex)handling ex;finally finalStatements;Next statement;最终块总是要执行26跟踪程序的执行try s
10、tatements;catch(TheException ex)handling ex;finally finalStatements;Next statement;方法中下边的语句要执行27跟踪程序的执行try statement1;statement2;statement3;catch(Exception1 ex)handling ex;finally finalStatements;Next statement;假设语句2要抛出类型为Exception1 的异常28跟踪程序的执行try statement1;statement2;statement3;catch(Exception1 e
11、x)handling ex;finally finalStatements;Next statement;此处处理Exception1异常29跟踪程序的执行try statement1;statement2;statement3;catch(Exception1 ex)handling ex;finally finalStatements;Next statement;最终块始终要执行30跟踪程序的执行try statement1;statement2;statement3;catch(Exception1 ex)handling ex;finally finalStatements;Next
12、 statement;现在执行方法中下边的语句31跟踪程序的执行try statement1;statement2;statement3;catch(Exception1 ex)handling ex;catch(Exception2 ex)handling ex;throw ex;finally finalStatements;Next statement;假设语句2抛出类型为Exception2的异常32跟踪程序的执行try statement1;statement2;statement3;catch(Exception1 ex)handling ex;catch(Exception2 e
13、x)handling ex;throw ex;finally finalStatements;Next statement;此处处理Exception2异常33跟踪程序的执行try statement1;statement2;statement3;catch(Exception1 ex)handling ex;catch(Exception2 ex)handling ex;throw ex;finally finalStatements;Next statement;执行最终块34跟踪程序的执行try statement1;statement2;statement3;catch(Excepti
14、on1 ex)handling ex;catch(Exception2 ex)handling ex;throw ex;finally finalStatements;Next statement;再次抛出异常,控制权转移给调用者35何时使用异常处理F异常处理将错误处理代码从正常的程序设计任务中分离出来,这样,可以使得程序更易读和更易修改F但是,应该注意,由于异常处理需要初始化新的异常对象,需要从调用栈返回,而且还需要沿着方法调用的链来传播异常以便找到它的异常处理器,所以,异常处理常常需要更多的时间和资源。36何时去抛出异常F异常出现在方法中。如果想让该方法的调用者处理异常,应该创建一个异常对
15、象并将其抛出。如果能在发生异常的方法中处理异常,那么就不需要抛出或使用异常。37何时用异常在代码中,什么时候用try-catch块呢?当必须处理不可预料的错误状况时应该使用它。不要用try-catch块处理简单的、可预料的情况,例如:try System.out.println(refVar.toString();catch(NullPointerException ex)System.out.println(refVar is null);38何时用异常最好改成if(refVar!=null)System.out.println(refVar.toString();else System.out.println(refVar is null);39定义定制的异常类F尽量使用API中预定义的异常类。F如果预定义的异常类不足,再定义定制异常类。F通过扩展异常或异常的子类,定义定制异常类。40定制异常类的例子RunInvalidRadiusException在清单13.8中,如果半径是负的,setRadius方法将抛出一个异常。假如我们希望将该半径传递给调用setRadius方法的程序,我们必须创建一个定制的异常类。CircleWithRadiusExceptionTestCircleWithRadiusException
限制150内