异常的体系结构
java.lang.Throwable
分为两种
java.lang.Error : 一般不便携针对性的代码进行处理
java.lang.Exception: 可以进行异常的处理
Exception
又分为
编译时异常(checked)
FileNotFoundException 文件找不到异常
ClassNotFoundException 类找不到异常
运行时异常(unchecked,RuntimeException)
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 下标越界异常
等等还有很多异常
对异常的处理
java异常处理的抓抛模型
过程一:“抛”,程序在正常执行过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象。并将此对象抛出,一旦抛出对象后,其后的代码将不再执行。
关于异常对象的产生:可以是系统自动生成的异常对象、也可以是手动的生成一个异常对象
过程二:“抓”,可以理解为异常的处理方式,try-catch-finally throws
异常处理方式1:try-catch-finally
try{
//可能会出异常的代码
}catch(异常类型1,变量1){
//处理异常的方式1
}catch(异常类型2,变量2){
//处理异常的方式2
}...
finally{
//一定执行的代码
}
方式1的特点
1.finally是可选的
2.使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,将会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配
3.一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理。一旦处理完成,就跳出当前的try-catch结构(在没写finally的情况。继续执行其后的代码)
4.catch中的异常类型如果没子父类关系,则谁生命权在上,谁声明在下无所谓。catch中的异常类型如果满足子父类关系,则要求子类一定声明在父类的上面。否则,报错
5.常用的异常对象处理的方式: String getMessage()
6.在try结构中声明的变量,出了try结构后,就不能再被调用
7.try-catch-finally结构可以嵌套
异常的处理方式2:
throws + 异常类型 写在方法的声明处,代表该方法执行时,可能会抛出的异常类型,当方法执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码就不再执行
写法:
public void aa () throws Exception{}
两种处理异常方式的对比
try-catch-finally : 真正的将异常给处理了
throws的方式只是将异常抛给了方法的调用者,并没有真正将异常处理掉
如何更好选择两种处理方式
1.如果父类中被重写的方法没有用throws方式处理异常,则子类重写的方法也不能使用throws,一位这如果子类重写的方法中异常,必须使用try-catch-finally的方式处理
2.执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的,这几个方法可以使用throws的方式处理,而执行方法a可以使用try-catch-finally的方式处理
手动抛出异常
throw new RuntimeException("输入数据非法");
throw new Exception("输入的数据非法");
自定义异常类
自定义异常类步骤:
1.继承异常结构: RuntimeException\Exception
2.提供全局常量,serialVersionUID
3.提供重载的构造器
写法
public class MyException extends Exception{
static final long serialVersionUID = -7034897193246939L;
public MyException(){}
public MyException(String n){
super(n);
}
}
补充重写规则
新增一条重写规则:
子类重写的方法抛出的异常不能大于父类被重写方法抛出的异常类型
本人是Java初学者,水平有限,本文章中如果有不对的地方,麻烦您能指出来。向您表示感谢。