异常的概念:
其实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();
} |
|