2016032404_异常的捕获与处理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第(1)页共(16)页1、课程名称:异常的捕获与处理2、知识点2.1、上次课程的主要知识点1、访问控制权限;2、单例设计模式。2.2、本次预计讲解的知识点1、异常的产生分析以及所带来的影响;2、异常的处理的基本格式;3、异常的处理流程;4、异常的处理模式;5、自定义异常。3、具体内容(★★★★★)Java中最为优秀的设计就在于异常的处理上,而且很简单。第(2)页共(16)页3.1、认识异常异常指的是导致程序中断执行的一种指令流。一旦产生异常并且没有正常处理的话,那么程序将会中断执行。范例:观察没有产生异常的代码publicclassTestDemo{publicstaticvoidmain(Stringargs[]){System.out.println(AAAAAAAAAAA计算开始AAAAAAAAAAA);System.out.println(BBBBBBBBBBB除法计算:+(10/2)+BBBBBBBB);System.out.println(CCCCCCCCCC计算结束CCCCCCCCCC);}}此时程序没有任何的问题,于是正常执行完毕。范例:观察产生异常的情况publicclassTestDemo{publicstaticvoidmain(Stringargs[]){System.out.println(AAAAAAAAAA计算开始AAAAAAAAAAA);System.out.println(BBBBBBBBBBB除法计算:+(10/0)+BBBBBBBB);System.out.println(CCCCCCCCCCC计算结束CCCCCCCCCC);}}此时的程序产生了异常,所以最终发现程序并没有正常执行完毕,而是打印了一行信息之后直接就进行了退出。3.2、处理异常在Java中提供有三个关键字进行异常处理:try、catch、finally。这三个关键字的组合如下:try{可能出现异常的语句;}[catch(异常类型对象){异常处理;}catch(异常类型对象){第(3)页共(16)页异常处理;}....][finally{不管是否出现异常都要执行;}]而对于以上给出的格式有三种组合:try...catch、try...catch..finally、try...finally。范例:进行异常的处理publicclassTestDemo{publicstaticvoidmain(Stringargs[]){System.out.println(AAAAAAAAAAA计算开始AAAAAAAAAAA);try{intresult=10/0;//进行计算,此处产生异常,之后的代码不执行了System.out.println(BBBBBBBBBBB除法计算:+result+BBBBBBBB);}catch(ArithmeticExceptione){System.out.println(e);//输出对象}System.out.println(CCCCCCCCCC计算结束CCCCCCCCCC);}}在try语句之中如果有多行代码的话,那么出现异常之后的代码将不再执行,而是直接跑到相应的catch中执行,catch进行产生的异常匹配。而本程序中处理的操作形式比较简单,只是进行了一个简单的对象输出。此时会告诉用户异常类型是什么,但是有一点不好。此时只是打印出了异常的信息,但是并不知道异常具体产生在那一行代码中,为了得到比较全面详细的异常信息,则可以利用异常类的printStackTrace()方法完成。范例:输出异常信息publicclassTestDemo{publicstaticvoidmain(Stringargs[]){System.out.println(AAAAAAAAAAA计算开始AAAAAAAAAAA);try{intresult=10/0;//进行计算System.out.println(BBBBBBBBBBB除法计算:+result+BBBBBBBB);}catch(ArithmeticExceptione){e.printStackTrace();}System.out.println(CCCCCCCCCCC计算结束CCCCCCCCCC);}}第(4)页共(16)页而对于异常的处理除了try...catch之外后面还可以一个finally代码。范例:观察finally使用publicclassTestDemo{publicstaticvoidmain(Stringargs[]){System.out.println(AAAAAAAAAAA计算开始AAAAAAAAAAA);try{intresult=10/0;//进行计算System.out.println(BBBBBBBBBBB除法计算:+result+BBBBBBBB);}catch(ArithmeticExceptione){e.printStackTrace();}finally{System.out.println(*********************************************);}System.out.println(CCCCCCCCCCC计算结束CCCCCCCCCC);}}没有产生异常。第(5)页共(16)页3.3、多个异常的处理在一个try语句之后可以编写多个catch进行处理。模拟一个输入的数字计算操作,假设现在要计算的两个数字是通过初始化参数设置上的。范例:修改程序代码publicclassTestDemo{publicstaticvoidmain(Stringargs[]){System.out.println(AAAAAAAAAAA计算开始AAAAAAAAAAA);try{intx=Integer.parseInt(args[0]);inty=Integer.parseInt(args[1]);intresult=x/y;//进行计算System.out.println(BBBBBBBBBBB除法计算:+result+BBBBBBBB);}catch(ArithmeticExceptione){e.printStackTrace();}finally{System.out.println(*********************************************);}System.out.println(CCCCCCCCCCC计算结束CCCCCCCCCC);}}于是下面就有了这样几种执行情况:·执行程序的时候没有设置初始化参数(javaTestDemo):ArrayIndexOutOfBoundsException·执行程序的时候输入的内容不是数字(javaTestDemoab):NumberFormatException·执行的时候输入的被除数为0(javaTestDemo100):ArithmeticException第(6)页共(16)页如果现在异常已经正常进行处理了,则最后的语句一定会执行,而如果没有处理,那么最后的语句将不执行,但是finally的代码永远都会出现。为了保证程序出现错误之后依然可以正常的执行完毕,那么可以采用多个catch处理。范例:修改代码,处理多个异常publicclassTestDemo{publicstaticvoidmain(Stringargs[]){System.out.println(AAAAAAAAAAA计算开始AAAAAAAAAAA);try{intx=Integer.parseInt(args[0]);inty=Integer.parseInt(args[1]);intresult=x/y;//进行计算System.out.println(BBBBBBBBBBB除法计算:+result+BBBBBBBB);}catch(ArithmeticExceptione){e.printStackTrace();}catch(ArrayIndexOutOfBoundsExceptione){e.printStackTrace();}catch(NumberFormatExceptione){e.printStackTrace();}finally{System.out.println(*********************************************);}System.out.println(CCCCCCCCCCC计算结束CCCCCCCCCC);}}这种代码使用if判断也行啊,折腾什么异常?提示:如果在try语句之中真的需要进行多个异常的处理,那么捕获范围大的异常要放在捕获范围小的异常之后,否则会出现语法错误。3.4、异常处理流程对于整个程序的异常处理,以上只是针对于语法进行了基本的使用说明,但是从本质上来讲,Java中的异常处理要比之前讲解的过程容易,而为了分析这个流程,下面先来看两个异常类的继承结构:java.lang.ArithmeticException:java.lang.NumberFormatException:java.lang.Object|-java.lang.Throwablejava.lang.Object|-java.lang.Throwable第(7)页共(16)页|-java.lang.Exception|-java.lang.RuntimeException|-java.lang.ArithmeticException|-java.lang.Exception|-java.lang.RuntimeException|-java.lang.IllegalArgumentException|-java.lang.NumberFormatException可以发现所有的异常类都是java.lang.Throwable的子类,而现在来观察Throwable类,此类定义如下:publicclassThrowableextendsObjectimplementsSerializable可以发现Throwable直接是Object子类。从JDK1.0就开始提供了。但是在Throwable下有两个子类,因此在开发中几乎不会考虑Throwable处理。面试题:请解释Throwable下的Error和Exception子类的区别。·Error:是在程序还未执行时出现的错误,一般指的都是JVM出错,用户无法处理;·Exception:指的是在程序运行中出现的异常,异常处理都是针对于此类型完成的。因此,在以后的开发之中,如果处理异常,能够处理的最大的父类就是Exception。那么下面就可以根据以上给出的结论来分析异常处理流程(面试题)。1、当程序中产生异常之后,会由JVM自动的根据异常类型实例化一个指定的异常类对象;2、程序需要判断当前的代码之中是否存在有异常处理逻辑,如果没有,则交由JVM默认处理,处理方式输出异常信息,而后中断程序执行;3、如果程序中存在有异常处理,则try语句会捕获该异常类的实例化对象(想象为引用传递);4、捕获到的异常类的实例化对象要与catch中的异常类型进行依次匹配;5、如果catch匹配了该异常类型则使用相应代码进行处理,随后要执行finally代码,如果没有任何一个catch匹配,则直接跳转到finally语句;6、执行完finally代码之后要判断该异常是否已经处理过了,如果已经处理过了,则继续执行后续代码,而如果没有处理,则程序将继续交由JVM默认处理;通过以上的分析,可以发现所谓的catch匹配异常,就跟方法的参数传递没什么区别,有一个实例化对象了,如果发现类型匹配,则进行接收。那么按照对象向上转型的原则,所有的子类对象都可以向父类转换,那么也就证明所有的异常实际上都可以使用Exception进行处理。范例:直接使用Exception处理异常publicclassTestDemo{publicstaticvoidmain(Stringargs[]){第(8)页共(

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功