目录
1、异常的概念以及结构体系
异常:在Java中,将程序执行的过程中发生的不正常行为称为异常。
我们可以通过这一张图来了解关于异常类的关系,这里我们可以看到:
Throwable:是异常体系里面最高的一层类,其派生出两个之类,Error和Exception
Error:是指Java虚拟机中无法解决的严重问题,比如:JVM的内部错误,资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生就很难解决
Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。
2、异常的分类
异常可以分为编译时异常和运行时异常
2.1、编译时的异常
这就是在编译时的异常,要想让它支持深拷贝,只需要覆写Object类中的clone()方法即可。
2.2、运行时异常
运行时异常,顾名思义就是程序在执行期间发生异常,也被称为非检查异常
RuntimeException以及子类对应的异常都称为运行时异常。
3、防御式编程
第一种,LBYL:look Before You Leap. 在操作前就进行准备防御,也被称为事前防御型
但是会看起来有点杂乱
当我们这样就是进行了,在开始操作前就进行了用户名以及密码的检查。
第二种,EAFP:It's Easier to Ask Forgiveness than Permission . 也就是先操作,遇到问题再处理,也被称为事后认错型
try{
用户名验证();
密码验证();
}catch (用户名验证异常){
处理用户名验证异常;
}catch(密码验证异常){
处理密码验证异常;
}
好处就是,正常流程与错误流程分离开的,代码更清晰,容易理解代码。
在Java中异常处理主要就是五个关键字:throw,try,catch,final,throws
4、异常的抛出
在编写程序时,如果程序中出现错误,此时就需要将错误的信息告知给调用者,比如:参数检测。
在java中,可以借助throw关键字,抛出一个指定异常对象,将错误信息告知给调用者。
throw new XXXException("异常产生的原因");
我们可以看到异常处理抛出来的信息是,数组下标越界了。
5、try-catch捕获并处理
当我们对这个进行使用try-catch进行捕获处理,发生了报错
这里无论是说明异常都会被exception捕获,那么也就不会被后面的NullPointerException捕获,所以通常这样的写法是错误的。
而当我们这样写,编译时就不会报错,因为这样的错误会先被NullPointerException捕获,如果处理不了,就会被Exception捕获
6、自定义异常类
这就是我们自定义的异常类,我们可以看到,这里面的自定义异常类,都需要继承Exception或者RuntimeException,然后再进行构造方法,这里面有个参数message,含义:出现异常的原因,也就是我们需要将出现异常的原因传入这个参数里面去。
ok了,这就是我对异常的一些理解了。