黑马程序员技术交流社区

标题: 异常处理机制 [打印本页]

作者: 郁金香大公爵    时间: 2015-7-23 16:25
标题: 异常处理机制

                        异常的概念:

其实jvm默认的异常处理机制,就是在调用printStackTrace方法,打印异常的堆栈跟踪信息

异常的由来:问题是现实生活中具体的事物,也可以被java的类所描述,并封装成对象。

严重问题是Error类进行描述,不编写针对性的代码对其进行处理
非严重的用Exception类进行描述,可以使用针对性的处理方式进行处理

Throwable是error和Exception的父类


   


                        异常的处理:

try{}       -->需要被检测的代码
catch(){}   -->处理异常的代码
finally{}   -->一定会执行的代码


当try捕获到异常时,try方法中异常以下的代码就不会在执行了,直接调用catch方法,但是主方法依然可以运行
对捕获到的异常对象进行常见方法操作:

getMessage();获取异常名字:/by zero;

toString();获取异常名字,还有异常的类名:

参数.printStackTrace();获取异常名字,异常的类名,还有异常出现的位置




在功能上通过throws Exception的关键字声明了该功能有可能会出现问题,而其他人则制定相应的catch处理方式

调用throws Exception声明的类时必须声明处理方式,(未报告的异常,必须对其进行捕获或声明以便抛出,要么捕获 要么抛出)否则编译失败,处理方式有两种:


捕获 -->当调用的方法throws Exception修饰,则说明此方法调用时有可能会出错,所以一般调用时写在try方法内部,并定义throws方法,以便在出问题时进行处理,处理完成后,主方法异常以下的代码继续执行。

抛出 -->可以在主方法添加throws Exception关键字抛出到虚拟机,出错后虚拟机自动处理了,调用了异常处理机制,主方法异常以下的代码不会继续执行。





                        当出现多异常时候的处理方式:

throws声明的类后边跟着多个异常类的名字,多个异常的声明用“ ,”隔开

声明了多少个异常类都应该用catch实现重载来声明更具体的异常解决方法

如果多个异常catch块中的异常出现继承关系,则父类catch块尽量往下边放

建议在catch进行处理时,catch一定要定义具体的处理方式,一般都是将异常保存在日志中,以便后期进行调试




                        自定义异常:


因为项目中会出现特有的问题,没有被java描述过

首先要自定义一个异常类 ,自定义的异常类必须继承Exception类,原因是因为异常体系有一个特点:异常类和异常对象都需要抛出

添加一个if条件语句 当不满足条件时手动抛出个异常,格式为:throw new 异常名字();

手动抛出异常,要么内部try catch处理,要么在函数上声明后让调用者处理,一般情况下,函数内出现异常,函数上需要声明

手动抛出异常时,有可能出现异常的类也要抛出异常,类后边修饰:throws +异常方法名称



                        自定义异常信息:


if条件选择时,不符合条件则throw new 异常名称("传入异常的信息");

自定义的异常只有异常名字,没有异常信息,可以覆写父类的方法,格式如下:

class 子类 extends Exception
{
        子类构造函数(String msg)
        {
                super(msg);
        }
}

因为父类已经把异常信息的操作都完成了,所以子类没必要去覆写,只要在子类的构造方法中super关键字调用父类的构造方法将数值传入就可以完成操作




                        RuntimeException的作用:

用if条件判断是否出现自定义的问题,将继承RuntimeException的类在if条件选择后边抛出throw new +子类名字,此类不用try、catch处理,有可能出现异常的类也不用throws抛出





                        throws与throw的区别

throws使用在函数上,throws使用在函数内

throws后边跟的是异常类,throws使用的是异常对象




                        finally的作用:

finally方法是当问题出现时,程序一定会执行的一个方法。

一些很重要的代码不管异常是否出现都需要执行,则使用finally方法块来执行。

finally是可以和try方法一起声明的,没有catch方法就代表该异常是检测时异常,那么就必须声明。


                        异常在子父类覆盖中的体现

子类在覆写父类方法时,如果父类的方法抛出异常,那么子类的覆写方法,只能抛出父类的异常或者该异常的子类

如果父类方法抛出多个异常,那么子类在覆写该方法时,只能抛出父类异常的子集,如果没有继承的子集,则只能用try、catch方法处理

如果父类或者接口的方法中没有异常抛出,那么子类在覆写方法时也不可以抛出异常,如果出现异常了只能进行try、catch处理




                        异常总结:


异常体系:
        
        Throwable
                |--Error
                |--Exception
                        L--RuntimeException

异常体系的特点:异常体系中的所有类以及建立的对象都具备可抛性,可以被throw和throws关键字所操作,只有异常体系具备这个特点

throw和throws的用法: throw定义在方法内,用于抛出异常对象
                      throws定义在函数上,用于抛出异常类,可以抛出多个,用“,”隔开

当方法内容有throw抛出异常对象,并未进行try处理,必须要在方法上声明,否则编译失败。注意,RuntimeException除外,也就是说,方法内如果抛出的是RuntimeException异常,方法上可以不用声明

如果方法上声明了异常,调用者需要进行处理,处理方法可以throws可以try

异常有两种:编译时被检测异常,一种是运行时异常(编译时不检测,运行时出错)

异常处理的语句:
try{}       -->需要被检测的代码
catch(){}   -->处理异常的代码
finally{}   -->一定会执行的代码


自定义异常,按照java的面向对象思想,将特有的问题进行封装
{
        Inter a =new Inter()
        {
                public void show(int a,int b){};
                public void func(){};
        };
        a.show(2,5);
        a.func();
}
作者: 徐会会    时间: 2015-7-23 17:10
学习一下。。。
作者: 狮子王    时间: 2015-7-23 22:11
  好帖~~   赞赞赞~  
作者: 郁金香大公爵    时间: 2015-7-24 08:57
狮子王 发表于 2015-7-23 22:11
好帖~~   赞赞赞~

客气客气
作者: 伯爵公子    时间: 2015-7-24 09:16
复习了一下,挺好
作者: 一城一世界    时间: 2015-7-24 09:21
不错不错,楼主好人
作者: 1556455422    时间: 2015-7-24 09:24
刚好要学这个,不错
作者: xclyijin    时间: 2015-7-24 09:40
异常还没复习过,正好可以用来复习。
作者: 孙晓磊    时间: 2015-7-24 15:15
似乎我们俩差不多进度,我刷到118了,你多少了,组队不
作者: 陈鹏No1    时间: 2015-7-24 15:17
学过不久,快忘了
作者: lizhichao    时间: 2015-7-24 18:40
当出基础测试的时候要是看到这个帖子也不会今天这样吧
作者: 陈建民1    时间: 2015-7-24 21:19
今天刚学到,再看看。。
作者: yongaidongbing    时间: 2015-7-25 00:54
。。。。。。。。。。。。。。。。。。。
作者: fantianfei    时间: 2015-7-25 01:00
不错的总结,只是太晚没时间仔细看。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2