《【精品】Java实用教程第13讲异常处理和断言精品ppt课件.ppt》由会员分享,可在线阅读,更多相关《【精品】Java实用教程第13讲异常处理和断言精品ppt课件.ppt(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java实用教程第13讲异常处理和断言发现错误的最佳时机是编译阶段,但编译时期并不能找出所有错误,有些错误是在运行时刻才被发现,例如数组访问时越界,要访问的文件不存在等。这就需要在程序运行期间处理这些可能发生的错误。13.1 Java的异常的异常Java异常类层次结构图13.2.1 捕获异常捕获异常在Java中,异常通过try-catch语句捕获对于有多个catch子句的异常程序而言,异常类的catch子句放在前面,同时尽量将捕获相对“高层”(类继承层次中的父类)的异常类的catch子句放在后面(5)在try-catch-finally结构中,可重新抛出异常。(6)除了下列情况,finally
2、语句块总要执行:在finally语句块中发生了异常;在前面的代码中用了System.exit()退出程序;程序所在的线程死亡;关闭CPU。异常处理语句执行顺序总结:(1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;(2)当try语句块里的某条语句出现异常,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;(3)当try语句块里的某条语句出现异常,并且存在处理此异常的catch语句块时,程序将跳到catch语句块,从第一
3、个catch语句块开始,从上到下找到与之对应的catch,其它的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句13.2.3 声明异常声明异常如果一个方法可能会出现异常,但没有能力处理这种异常,或者想把异常集中起来一块处理,可以使用关键字throws声明这个方法可能会产生异常。多个异常可使用逗号分割。throws语句的语法格式为:myMethod()throws Exception1,Exception2,.,ExceptionN 方法名后的throws Except
4、ion1,Exception2,.,ExceptionN 为声明要抛出的异常类型列表。13.2.4 抛出异常抛出异常JVM可以抛出异常,当需要抛出某个异常时,也可以借助关键字throw来抛出某个异常对象。程序会在throw语句后立即终止,它后面的语句得不到执行13.3 捕获所有异常捕获所有异常因为向上转型,所有异常类对象都能够向上转型为Exception类型,所以通过捕获Exception类型,就可以捕获所有异常。如果有多个catch,最好把Exception类型语句放在所有catch的后面。13.3.1 异常轨迹异常轨迹可以调用Exception的父类Throwable中的方法获得异常的详细
5、信息和调用栈轨迹:(1)void printStackTrace():将此throwable及其追踪输出至标准错误流。(2)void printStackTrace(PrintStream s):将此throwable及其追踪输出到指定的输出流。(3)void printStackTrace(PrintWriter s):将此throwable及其追踪输出到指定的PrintWriter。通过getStackTrace()方法可以获得printStackTrace()的信息13.3.2 重新抛出异常重新抛出异常有时希望把捕获的异常对象重新抛出,交给上一级环境中的异常处理程序去处理。异常对象被重新
6、抛出后,所有信息都能够被保持,所以在上一级的异常处理程序中能够得到原有异常对象的所有信息。13.3.3 异常链异常链捕获一个异常对象后抛出另外一个异常对象,并且希望把原异常对象抛出点的调用栈信息保存下来,这被称为异常链。在JDK1.4之后,Throwable及其子类在创建异常对象时,都能够接收一个对象作为参数,这个参数能够表示原始异常,能够传递给信息异常。通过异常链可以追踪到异常最初被抛出的地方。13.3.4 异常的丢失异常的丢失Java异常处理机制的设计也存在缺陷,就是异常会丢失13.4 自定义异常自定义异常使用Java类库中提供的异常类不能解决全部的问题,这时需要创建自定义的异常类,自定义
7、异常类必须是Exception或其子类的派生类。13.5 异常的限制异常的限制(1)如果父类构造器有异常说明,那么子类构造器也必须声明抛出父类构造器中声明的那些异常。子类构造器的异常说明中可以有基类构造器中没有的异常说明。(2)如果父类的被重写方法没有异常说明,那么子类里的重写方法也不能有异常说明;如果父类的被重写方法有异常说明,那么子类里的重写方法中的定义要么没有异常说明,要么有的话则异常说明里的异常必须包含在父类被重写方法的异常说明里列出的那些异常之中。(3)如果子类不仅继承了一个父类还实现了一个或多个接口,而且该重写方法在两个或两个以上的接口(父类)中存在,那么子类中的重写方法声明抛出的
8、异常应为存在该方法的那些接口(父类)中的该方法声明抛出的异常的交集。总之,如果方法被重写,要求被重写的方法一定不能声明抛出新的异常或比原方法范畴更广的异常。13.6 断言断言JVM断言默认是关闭的。如在Eclipse里可以通过下面的步骤开启断言:Run-Run Configurations-Arguments页签-VM arguments文本框中加上断言开启的标志:-enableassertions 或者-ea。断言的语法形式有两种形式:(1)assert condition;(2)asser condition:expr;讲后练习讲后练习1、运行时异常与一般异常有何异同?2、error和exception有什么区别?3、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?