【回炉重造】—— 异常

目录

异常的引入

异常的分类

五个关键字

try

catch

finally

throw

throws

throw 和throws的区别

处理异常的方式

自定义异常


异常的引入

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向上抛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值