• 1. Java异常处理第三章
  • 2. 3.1本章任务了解异常的定义 了解异常的分类 掌握 try、catch 和 finally 语句的用法 掌握throw、throws子句的用法 掌握如何定义自己的异常2
  • 3. 3.2 基础知识3
  • 4. 异常的概念 运行时发生的错误称为异常。处理这些异常就称为异常处理。 一旦引发异常,程序将突然中止,且控制将返回操作系统。 发生异常后此前分配的所有资源都将保留在相同的状态,这将导致资源漏洞。4
  • 5. Java异常处理机制Java异常处理机制采用一个统一和相对简单的抛出和处理错误的机制。如果一个方法本身能引发异常,当所调用的方法出现异常时,调用者可以捕获异常使之得到处理;也可以回避异常,这时异常将在调用的堆栈中向下传递,直到被处理。5
  • 6. 异常的分类所有异常类型都是 内置类Throwable的子类用于Java运行时系统 来显示与运行时系 统本身有关的错误用于用户程序可能 捕获的异常,也是用来创建用户异常类型子类的类。Error类对象由Java虚拟机生成并抛出; Exception类对象由应用程序处理或抛出。6
  • 7. 捕获和处理异常 由五个关键字 try、catch、throw、throws 和 finally 处理。 Java 中可用于处理异常的两种方式: 自行处理:可能引发异常的语句封入在 try 块内,而处理异常的相应语句则封入在 catch 块内。 回避异常:在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,必须由调用者处理。7
  • 8. try - catch 块示例 public class ExceptionDemo {   public static void main(String args[]) { try { int c= calculate(9,0); System.out.println(c); } catch (Exception e) { System.err.println("发生异常: " + e.toString()); e.printStackTrace(); } }   static int calculate(int a, int b) { int c = a/b; return c; } } 调用函数calculate, 将引发一个异常在catch块中处理异常输出 结果8
  • 9. 多个 catch 块单个代码片段可能会引起多个错误。 可提供多个 catch 块分别处理各种异常类型。. . . try{ } catch(ArrayIndexOutOfBoundsException e){ } catch(Exception e) { } ...ArrayIndexOutOfBoundsException类为 Exception 类的子类,但是如果异常 属于ArrayIndexOutOfBoundsException类将执行第一个 catch 块,之后控制 将转向try/catch块之后的语句,所以始终不会执行第二个 catch 块。 9
  • 10. 多个 catch 块示例class Catch22 {   public static void main(String args[]) { try { String num=args[0]; int numValue=Integer.parseInt(num); System.out.println("平方为 "+numValue*numValue); } catch(ArrayIndexOutOfBoundsException ne) { System.out.println("未提供任何参数!"); } catch(NumberFormatException nb) { System.out.println("不是数字!"); } } } 输出 结果10
  • 11. 嵌套的 try - catch 块有时,块的一部分引起一个错误,而整个块可能又引起另一个错误。在此情况下,需要将一个异常处理程序嵌套到另一个中。 在使用嵌套的try块时,将先执行内部 try 块,如果没有遇到匹配的 catch 块,则将检查外部 try 块的 catch 块。11
  • 12. finally 块确保了在出现异常时所有清除工作都将得到处理 与 try 块一起使用 无论是否出现异常,finally块都将运行finallycatch 块finally异常没有异常try 块12
  • 13. finally 块 示例class FinallyDemo { int no1,no2; FinallyDemo(String args[]) { try { no1 = Integer.parseInt(args[0]); no2 = Integer.parseInt(args[1]); System.out.println("相除结果为 "+no1/no2); } catch(ArithmeticException i) { System.out.println("不能除以 0"); } finally { System.out.println("Finally 已执行"); } }   public static void main(String args[]) { new FinallyDemo(args); } } 输出 结果13
  • 14. 抛出异常 throw机制 throws机制14
  • 15. 使用 throw异常是通过关键字 throw 抛出,程序可以用throw语句引发明确的异常。如: try { if(flag<0) { throw new NullPointerException(); } } throw语句的操作数一定是Throwable类类型或Throwable子类类型的一个对象。15
  • 16. 使用 throws如果一个方法可能导致一个异常但不处理它,此时要求在方法声明中包含 throws 子句,通知潜在调用者,如果发生了异常,由调用者处理。 一个throws子句列举了一个方法可能引发的所有异常类型。 这对于除Error或RuntimeException及它们子类以外类型的所有异常是必要的。16
  • 17. 使用 throws示例class ThrowsDemo{   static void throwOne() throws IllegalAccessException{ System.out.println("在throwOne中."); throw new IllegalAccessException("非法访问异常"); }   public static void main(String args[]){ try{ throwOne(); } catch(IllegalAccessException e){ System.out.println("捕获"+e); } } } 在该方法中没有处 理异常,只是声明 可能引发的异常在throwOne方法 的调用函数中捕 获并处理异常17
  • 18. 3.3 案例3及案例分析具体案例分析见本书18
  • 19. 3.4 扩展知识19
  • 20. 自定义异常类内置异常不可能始终足以捕获所有错误,因此需要用户自定义的异常类 用户自定义的异常类应为 Exception 类(或者Exception 类的子类)的子类 创建的任何用户自定义的异常类都可以获得 Throwable类定义的方法class ArraySizeException extends NegativeArraySizeException{ ArraySizeException() { super(“您传递的是非法的数组大小”); } }该类是Exception的子类20
  • 21. 使用自定义异常类示例class UserExceptionDemo { int size, array[]; UserExceptionDemo(int s) { size = s; try { checkSize(); } catch(ArraySizeException e) {System.out.println(e);} }   void checkSize() throws ArraySizeException { if(size < 0) throw new ArraySizeException(); array = new int[size]; for(int i = 0; i < size; i++) { array[i] = i+1; System.out.print(array[i]+" "); } }   public static void main(String arg[]) { new UserExceptionDemo(Integer.parseInt(arg[0])); } } 输出 结果21
  • 22. 异常类提供的常用方法 2-1异常说明RuntimeException java.lang包中多数异常的基类 ArithmeticException 算术错误,如除以 0 IllegalArgumentException 方法收到非法参数 ArrayIndexOutOfBoundsException 数组下标出界 NullPointerException 试图访问 null 对象引用 SecurityException 试图违反安全性 ClassNotFoundException不能加载请求的类22
  • 23. 异常类提供的常用方法 2-2异常说明AWTException AWT 中的异常 IOException I/O 异常的根类 FileNotFoundException 不能找到文件 EOFException 文件结束 IllegalAccessException 对类的访问被拒绝 NoSuchMethodException 请求的方法不存在 InterruptedException 线程中断 23
  • 24. 小结 2-1运行时发生的错误称为异常。 必须捕获引发的每个异常,否则应用程序不会正常中止。 异常处理允许在一个地方集中进行错误处理。这使得可以创建功能强大且健壮的代码。 Java 使用 try 和 catch 块来处理异常。try 块中的语句引发异常,而 catch 块则处理异常。 24
  • 25. 小结 2-2可以同时使用多个 catch 块来分别处理各种异常类型。 程序可以用throw语句引发明确的异常。 关键字 throws 用于列出一个方法可能引发的异常类型。 不管是否发生了异常,都将执行 finally 块中的语句。25