1、1 异常 第6章 2 目标 了解异常的定义了解异常的分类掌握try catch和finally语句的用法掌握throw throws子句的用法掌握如何定义自己的异常 3 什么是异常 运行时发生的错误称为异常 处理这些异常就称为异常处理 一旦引发异常 程序将突然中止 且控制将返回操作系统 发生异常后此前分配的所有资源都将保留在相同的状态 这将导致资源漏洞 4 异常体系结构 所有异常类型都是内置类Throwable的子类 用于Java运行时系统来显示与运行时系统本身有关的错误 用于用户程序可能捕获的异常 也是用来创建用户异常类型子类的类 Error类对象由Java虚拟机生成并抛出 Exceptio
2、n类对象由应用程序处理或抛出 5 常见异常及其用途2 1 6 常见的异常及其用途2 2 7 Java异常处理基础 Java异常处理机制采用一个统一和相对简单的抛出和处理错误的机制 如果一个方法本身能引发异常 当所调用的方法出现异常时 调用者可以捕获异常使之得到处理 也可以回避异常 这时异常将在调用的堆栈中向下传递 直到被处理 8 异常处理模型 由五个关键字try catch throw throws和finally处理 Java中可用于处理异常的两种方式 自行处理 可能引发异常的语句封入在try块内 而处理异常的相应语句则封入在catch块内 回避异常 在方法声明中包含throws子句 通知潜
3、在调用者 如果发生了异常 必须由调用者处理 9 多个catch块 单个代码片段可能会引起多个错误 可提供多个catch块分别处理各种异常类型 try catch ArrayIndexOutOfBoundsExceptione catch Exceptione ArrayIndexOutOfBoundsException类为Exception类的子类 但是如果异常属于ArrayIndexOutOfBoundsException类将执行第一个catch块 之后控制将转向try catch块之后的语句 所以始终不会执行第二个catch块 10 多个catch块示例 classCatch22 publ
4、icstaticvoidmain Stringargs try Stringnum args 0 intnumValue Integer parseInt num System out println 平方为 numValue numValue catch ArrayIndexOutOfBoundsExceptionne System out println 未提供任何参数 catch NumberFormatExceptionnb System out println 不是数字 11 嵌套的try catch块 有时 块的一部分引起一个错误 而整个块可能又引起另一个错误 在此情况下 需要将一
5、个异常处理程序嵌套到另一个中 在使用嵌套的try块时 将先执行内部try块 如果没有遇到匹配的catch块 则将检查外部try块的catch块 12 finally块 确保了在出现异常时所有清除工作都将得到处理与try块一起使用无论是否出现异常 finally块都将运行 13 finally块示例 classFinallyDemo intno1 no2 FinallyDemo Stringargs try no1 Integer parseInt args 0 no2 Integer parseInt args 1 System out println 相除结果为 no1 no2 catch
6、ArithmeticExceptioni System out println 不能除以0 finally System out println Finally已执行 publicstaticvoidmain Stringargs newFinallyDemo args 14 使用throw 异常是通过关键字throw抛出 程序可以用throw语句引发明确的异常 如 try if flag 0 thrownewNullPointerException throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象 15 使用throws 如果一个方法可能导致一个异常
7、但不处理它 此时要求在方法声明中包含throws子句 通知潜在调用者 如果发生了异常 由调用者处理 一个throws子句列举了一个方法可能引发的所有异常类型 这对于除Error或RuntimeException及它们子类以外类型的所有异常是必要的 16 使用throws示例 classThrowsDemo staticvoidthrowOne throwsIllegalAccessException System out println 在throwOne中 thrownewIllegalAccessException 非法访问异常 publicstaticvoidmain Stringarg
8、s try throwOne catch IllegalAccessExceptione System out println 捕获 e 在该方法中没有处理异常 只是声明可能引发的异常 在throwOne方法的调用函数中捕获并处理异常 17 用户自定义的异常 内置异常不可能始终足以捕获所有错误 因此需要用户自定义的异常类用户自定义的异常类应为Exception类 或者Exception类的子类 的子类创建的任何用户自定义的异常类都可以获得Throwable类定义的方法 classArraySizeExceptionextendsNegativeArraySizeException ArrayS
9、izeException super 您传递的是非法的数组大小 该类是Exception的子类 18 使用用户自定义的异常示例 classUserExceptionDemo intsize array UserExceptionDemo ints size s try checkSize catch ArraySizeExceptione System out println e voidcheckSize throwsArraySizeException if size 0 thrownewArraySizeException array newint size for inti 0 i s
10、ize i array i i 1 System out print array i publicstaticvoidmain Stringarg newUserExceptionDemo Integer parseInt arg 0 19 总结2 1 运行时发生的错误称为异常 必须捕获引发的每个异常 否则应用程序不会正常中止 异常处理允许在一个地方集中进行错误处理 这使得可以创建功能强大且健壮的代码 Java使用try和catch块来处理异常 try块中的语句引发异常 而catch块则处理异常 20 总结2 2 可以同时使用多个catch块来分别处理各种异常类型 程序可以用throw语句引发明确的异常 关键字throws用于列出一个方法可能引发的异常类型 不管是否发生了异常 都将执行finally块中的语句