异常的捕获及处理.ppt
第6章 异常的捕获及处理,6.1 异常简介,在程序运行过程中,可能会遇到一些非正常的状况。例如:除以零、数组越界、文件读写时找不到指定的路径、数据库操作时连接不到指定的服务器。此时程序将无法继续运行,导致整个程序运行中断。这种非正常状况对程序来说是一种异常。程序员在程序的设计中必须考虑到各种异常的发生,并做好相应的处理。通常一个好的程序,整体的1/3是在处理要完成的真正任务,而2/3是在处理异常,这样的程序才是最强壮的。Java提供一套完整的异常处理机制,保证程序的正常运行.,6.2 异常类的继承结构,查阅API文档,Java程序中的异常现象也采用了面向对象的思想,所有的异常都使用类来描述。,6.2 异常类的继承结构,Error 类:应用程序在运行期间发生的严重错误。例如,虚拟机内存用尽、堆栈溢出等。(程序员管不了)Exception 类:几十个子类,描述了不同类型的异常。非检查性异常:编译器在编译程序时不进行检查,到运行时才会显现。例如RuntimeException,像数组越界异常、整数除以零异常等。这类异常应该通过反复测试尽量避免,不应该靠异常处理机制来处理,主要是由程序员经验不足或思维不够缜密造成的。检查性异常:编译器在编译程序时必须进行异常处理,否则编译时不能通过。例如IOException,像数据库连接失败、用光盘时用户没插入光盘等。这类异常程序员是无法避免的,应由异常处理机制处理。,6.3 异常处理机制,异常处理的两种方式捕获异常trycatchfinally抛出异常throw、throws,处理异常时编程人员做什么?给异常类对象起名字抓它处理它抛它,public class ExceptionDemo01 public static void main(String args)System.out.println(*计算开始*);int i=10;int j=0;int temp=i/j;System.out.println(两个数字相除的结果:+temp);System.out.println(*计算结束*);,1.异常范例ExceptionDemo01.java,try 可能出现异常的语句;catch(异常类1 异常对象名)异常1的处理语句;catch(异常类2 异常对象名)异常2的处理语句;finally 一定要运行的语句;,关键字作用try:捕捉异常catch:处理异常finally:异常的统一出口,2.异常处理try-catch-finally,public class ExceptionDemo02 public static void main(String args)System.out.println(*计算开始*);int i=10;int j=0;System.out.println(*计算结束*);,范例ExceptionDemo02.java,try int temp=i/j;/此处产生了异常 System.out.println(两个数字相除的结果:+temp);,catch(ArithmeticException ae)System.out.println(出现异常了:+ae);,程序在开发中不会只存在一个异常,肯定会同时存在多个异常。此时就需要使用多个catch语句进行处理,多重catch处理异常,编程:使用键盘输入两个数据,进行除法操作。分析(考虑异常情况):没有输入参数或个数不够数组超出绑定异常输入的参数不是数字数字格式化异常除数为零算术异常,public class ExceptionDemo04public static void main(String args)int i,j;tryString str1=args0;/可能有异常String str2=args1;/可能有异常i=Integer.parseInt(str1);j=Integer.parseInt(str2);int temp=i/j;/可能有异常System.out.println(相除的结果:+temp);catch(ArithmeticException e)System.out.println(算术异常:+e);catch(NumberFormatException e)System.out.println(数字转换异常:+e);catch(ArrayIndexOutOfBoundsException e)System.out.println(数组越界异常:+e);catch(Exception e)System.out.println(异常:+e);System.out.println(*计算结束*);,范例ExceptionDemo04.java,验证finally的作用:异常的统一出口,public class ExceptionDemo03 public static void main(String args)System.out.println(*计算开始*);int i=10;int j=2;tryint temp=i/j;System.out.println(两个数字相除的结果:+temp);catch(ArithmeticException ae)System.out.println(出现异常了:+ae);finally System.out.println(不管是否出现异常,都执行此代码);System.out.println(*计算结束*);,验证finally的作用:异常的统一出口,tryopenDB();readDB();closeDB();catch(Exception e)System.out.println(出现异常了:+e);,tryopenDB();readDB();catch(Exception e)System.out.println(出现异常了:+e);finally closeDB();,直接打印异常类对象:System.out.println(e);使用Exception类提供的一个方法:printStackTrace()(注:开发中常用,打印异常的堆栈信息),3.异常信息的输出,public class ExceptionDemo05 public static void main(String args)System.out.println(*计算开始*);int i=10;int j=0;try int temp=i/j;/此处产生了异常 System.out.println(相除的结果:+temp);catch(Exception e)e.printStackTrace();System.out.println(*计算结束*);,4.异常抛出throws、throw,throws:如果一个方法引发了异常,但该方法本身并不对这个异常进行处理,而是交给被调用处处理。那么该方法就要用throws关键字来声明。例:public int div(int i,int j)throws Exception 不含处理异常语句;,class Math/定义除法类public int div(int i,int j)int temp=i/j;/此处有可能出现异常return temp;public class ThrowsDemopublic static void main(String args)Math m=new Math();/实例化Math类对象 System.out.println(除法操作:+m.div(10,0);,范例ThrowsDemo.java,throws Exception,trycatch(Exception e)e.printStackTrace();/打印异常,4.异常抛出throws、throw,throw:有2个功能Java中异常处理是分层次的,throw可以把捕获到的异常抛 到上一层,由上一层进行异常处理。格式:throw 异常类对象;以前处理的异常都是由系统(JVM)自动实例化的,不用new.现在,可以使用throw关键字在方法中手动抛出一个异常。,范例ThrowDemo02.java,class Mathpublic int div(int i,int j)int temp=0;tryint temp=i/j;/此处有可能出现异常catch(Exception e)throw e;return temp;public class ThrowDemo02public static void main(String args)Math m=new Math();trySystem.out.println(除法操作:+m.div(10,0);catch(Exception e)System.out.println(异常产生:+e);,public class ThrowDemo01public static void main(String args)trythrow new Exception(自己抛着玩的。);catch(Exception e)System.out.println(e);,范例ThrowDemo01.java,5.实战,设计一个两个整数相除的程序。要求:在计算开始处打印“计算开始”信息 在计算结束处打印“计算结束”信息 如有异常交给调用处处理,说明:在一般的开发中trycatchfinally、throw、throws联合使用的情况是最多的。,class Mathpublic int div(int i,int j)throws Exception(*计算开始*);int temp=0;/定义局部变量trytemp=i/j;/此处有可能出现异常catch(Exception e)throw e;finally(*计算结束*);return temp;public class ThrowDemo03public static void main(String args)Math m=new Math();trySystem.out.println(除法操作:+m.div(10,0);catch(Exception e)System.out.println(异常产生:+e);,范例ThrowDemo03.java,6.4 本章小结,1.异常是导致程序中断运行的一种指令流。当异常发生时,如果 没有进行处理,程序将会中断执行。2.异常的最大父类是Throwable,分为两个子类,分别是Error、Exception。Exception表示程序可以处理的异常;而Error表 示JVM错误,一般不由程序开发人员处理。3.异常可以使用trycatchfinally进行处理。在try语句中捕捉 异常,然后在catch中处理异常,finally作为异常的统一出口,不管是否发生异常都要执行finally段代码。4.异常也可以不处理,而是抛出。在方法声明处使用throws,表 示该方法不处理异常,交给被调用处处理;使用throw可以在 方法中手动抛出一个异常。,