032404异常的捕获与处理.docx
- 文档编号:6809786
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:22
- 大小:1.13MB
032404异常的捕获与处理.docx
《032404异常的捕获与处理.docx》由会员分享,可在线阅读,更多相关《032404异常的捕获与处理.docx(22页珍藏版)》请在冰豆网上搜索。
032404异常的捕获与处理
1、课程名称:
异常的捕获与处理
2、知识点
2.1、上次课程的主要知识点
1、访问控制权限;
2、单例设计模式。
2.2、本次预计讲解的知识点
1、异常的产生分析以及所带来的影响;
2、异常的处理的基本格式;
3、异常的处理流程;
4、异常的处理模式;
5、自定义异常。
3、具体内容(★★★★★)
Java中最为优秀的设计就在于异常的处理上,而且很简单。
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(异常类型对象){
异常处理;
}....][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");
}
}
而对于异常的处理除了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");
}
}
没有产生异常。
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
如果现在异常已经正常进行处理了,则最后的语句一定会执行,而如果没有处理,那么最后的语句将不执行,但是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.Throwable
|-java.lang.Exception
|-java.lang.RuntimeException
|-java.lang.ArithmeticException
java.lang.Object
|-java.lang.Throwable
|-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[]){
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(Exceptione){
e.printStackTrace();
}finally{
System.out.println("*********************************************");
}
System.out.println("CCCCCCCCCCC计算结束CCCCCCCCCC");
}
}
在实际的开发过程之中,如果你的开发团队有明确的要求,那么就分开处理。
但是如果要求不明确的情况下,使用Exception处理是最方便的。
3.5、throws关键字
异常的处理语句本身使用并不复杂,但是最为麻烦的是,执行到某些代码的时候,用户如何知道这个代码会产生什么异常?
所以在Java中提供有一个throws关键字,这个关键字的主要目的是明确的告诉用户执行某一个方法中有可能会产生那些异常。
所以throws主要是用于方法的声明处。
范例:
观察throws关键字的使用
classMyMath{
publicstaticintdiv(intx,inty)throwsException{
returnx/y;
}
}
在这个div()方法上那么就表示,如果要想执行本语句,那么就必须进行异常的处理。
范例:
不处理异常,而直接调用
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
System.out.println(MyMath.div(10,2));
}
}
如果程序中使用了throws的声明,那么就表示必须强制性进行异常的处理操作。
范例:
正确的调用形式
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){
try{
System.out.println(MyMath.div(10,2));
}catch(Exceptione){
e.printStackTrace();
}
}
}
但是使用了throws之中还存在有一个传递问题,主方法也是一个方法,所以主方法上也可以使用throws,那么就表示此时的主方法不进行异常的处理,而交给被调用处处理。
classMyMath{
publicstaticintdiv(intx,inty)throwsException{
returnx/y;
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[])throwsException{
System.out.println(MyMath.div(10,0));
}
}
主方法之上那么就由JVM进行默认的处理,所以一般而言,如果你直接写Java代码,主方法中应该把异常全部处理完成。
3.6、throw关键字
现在为止所有的异常对象都是由Java负责进行实例化的,我们能够进行的处理只能够进行捕获。
但是在Java中允许用户自己去实例化异常类对象,那么如果要抛出这个对象,就必须使用throw关键字。
范例:
自己手工抛出异常
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){//throwsException
thrownewException("老子就抛怎么着。
");
}
}
只要出现了throw,那么就表示代码中产生了异常,此时就两个选择:
·方法上使用throws继续抛出;
·手工使用异常处理。
范例:
异常处理
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){//throwsException
try{
thrownewException("老子就抛怎么着。
");
}catch(Exceptione){
e.printStackTrace();
}
}
}
面试题:
请解释throw与throws的区别?
·throw在方法体中使用,表示手工抛出一个异常类的实例化对象;
·throws在方法的声明中使用,表示此方法调用时必须明确进行异常的处理。
3.7、异常处理的模型(核心)
对于异常的处理已经学习过了:
try、catch、finally、throw、throws,其中感觉finally、throw存在的意义不大,但事实上这些关键字如果真要使用,肯定是一起使用。
现在假设要定义一个实现除法计算的方法,但是此方法的设计有如下要求:
·在进行除法计算开始要求可以打印提示信息,例如:
“*******计算开始********”;
·在进行除法计算完成之后要求可以打印提示信息,例如:
“*******计算结束********”;
·如果在除法操作中出现了问题,那么必须交给被调用处处理。
范例:
程序的基本实现
classMyMath{
publicstaticintdiv(intx,inty)throwsException{//交给被调用处处理
intresult=0;//保存计算结果
System.out.println("******除法计算开始******");
result=x/y;
System.out.println("******除法计算结束******");
returnresult;
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){//throwsException
try{
System.out.println(MyMath.div(10,2));
}catch(Exceptione){
e.printStackTrace();
}
}
}
一旦程序出现了错误,这个时候的执行结果如下。
范例:
加入异常控制
classMyMath{
publicstaticintdiv(intx,inty)throwsException{//交给被调用处处理
intresult=0;//保存计算结果
System.out.println("******除法计算开始******");
try{
result=x/y;
}catch(Exceptione){
throwe;//继续向上抛
}finally{
System.out.println("******除法计算结束******");
}
returnresult;
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){//throwsException
try{
System.out.println(MyMath.div(10,0));
}catch(Exceptione){
e.printStackTrace();
}
}
}
在以后的开发之中,一定会牵扯到资源的使用,例如:
文件、数据库,数据库操作前一定要打开,操作后一定要关闭。
但是以上给出的异常处理模型可以简化:
try...finally。
classMyMath{
publicstaticintdiv(intx,inty)throwsException{//交给被调用处处理
intresult=0;//保存计算结果
System.out.println("******除法计算开始******");
try{
result=x/y;
}finally{
System.out.println("******除法计算结束******");
}
returnresult;
}
}
publicclassTestDemo{
publicstaticvoidmain(Stringargs[]){//throwsException
try{
System.out.println
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 032404 异常 捕获 处理