目录
异常的引入
Exception:异常,就是在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,我们称之为出现异常。
平时有些可能发生异常的地方可以用if-else避免,但是使用if-else堵漏洞有很多缺点:代码臃肿,业务代码和处理异常的代码混在一起,可读性差,很难堵住所有的漏洞。这样就引入了异常。try-catch体,业务代码放在try里面正常写,抛出异常和处理异常的地方交给catch。这样就区分了正常业务代码和处理异常的代码。
异常的分类
按照异常出现的时机,分为运行时异常和检查异常,运行时异常是
五个关键字
认识了异常的分类,异常里面还有五个关键字
try
catch
try-catch就是捕获异常的格式
把可能出现异常的代码放入try代码块中,然后将异常封装为对象,被catch后面的()中的那个异常对象接收,接收以后,执行catch后面()里面的代码,然后try-catch后面的代码,该怎么执行就怎么执行。
详细说一下:
(1)try中没有异常,catch中代码不执行
(2)try中有异常,catch进行捕获:
如果catch中异常类型和抛出的异常类型匹配的话,走catch中的代码,进行捕获
如果catch中异常类型和你出的异常类型不匹配的话,不走catch中的代码,没有捕获成功,程序相当于遇到异常了,中断了,后续代码不执行
注意:
(1)try中如果出现异常,然后用catch捕获成功的话,那么try中后续的代码是不会执行的
(2)如果catch捕获异常成功,那么try-catch后面的代码该执行还是执行没有影响。
finally
在使用try-catch,如何让它后面的代码必须执行呢?finally派上用场,主要将必须执行的代码放入finally中,那么这个代码无论如何一定会执行。
那么return和finally谁先执行谁后执行呢?答案是先执行finally最后执行return。
所以一般像关闭数据库连接,关闭IO流资源,关闭socket资源等会放在finally中。
throw
与try-catch组队使用,在catch内部负责抛出异常
throws
在方法体上负责向上抛出异常
throw 和throws的区别
从位置、内容和作用throw 和throws主要有以前区别:
(1)位置不同:
throw:方法内部
throws:方法的签名处,方法的声明处
(2)内容不同:
throw+异常对象(检查异常、运行时异常)
throw+异常的类型(可以多个类型,用,拼接)
(3)作用不同:
throw:异常出现的源头,制造异常
throws:在方法的声明处,告诉方法的调用者,这个方法中可能会出现我声明的这些异常,然后调用者对这个异常进行处理:要么自己处理要么再继续向外抛出异常。
处理异常的方式
(1)try-catch嵌套
public static void main(String... args) {
//检查异常
try {
Class.forName("com.wu.test01.Test").newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
(2)多重catch
public static void main(String... args) {
//检查异常
try {
Class.forName("com.wu.test01.Test").newInstance();
} catch (InstantiationException | IllegalAccessException |ClassNotFoundException e) {
e.printStackTrace();
}
}
(3)方法体向上抛
public static void main(String... args)throws ClassNotFoundException, IllegalAccessException, InstantiationException {
//检查异常
Class.forName("com.wu.test01.Test").newInstance();
}
自定义异常
jdk给我们提供了非常多的异常类,除了这些,我们还可以自己自定义异常,供我们复杂的业务使用。像是有些框架需要统一异常格式。
继承运行时异常
public class MyException extends RuntimeException {
private static final long serialVersionUID = 7640226454691274383L;
public MyException() {
}
public MyException(String msg) {
spuer(msg);
}
}
也可以继承检查异常
如果继承的是运行时异常,那么在使用的时候无需额外处理
如果继承的是检查异常,那么使用的时候需要try-catch捕获或者throws向上抛