资讯专栏INFORMATION COLUMN

java 异常学习

gghyoo / 1064人阅读

摘要:因为是由虚拟机自动抛出并自动捕获,所以又叫非检查异常。多异常捕获在之前,对多种的异常只能使用多个来进行捕获。注意多种异常类型之间用竖线隔开。多重块后面,最好再有个块用来捕获异常,防止遗漏。期待自己的异常进阶。

异常的体系机构

Java提供了丰富的异常类,而这些异常类之间又有这严格的继承关系。下面让我们看一下Java中异常的体系结构。

首先,Java将所有的不正常情况分为两种,一种是错误(Error),另一种就是我们所说的异常(Exception)

Error错误是我发恢复,不能获取的,如系统崩溃,虚拟机错误,动态链接失败等。这会导致程序直接中断。

Exception是我们常说的异常,他又大致分为两类,一类是运行时异常:RuntimeException,另一类就是其他异常。因为RuntimeException是由Java虚拟机自动抛出并自动捕获,所以又叫非检查异常。而另一类异常就不一样了,需要我们手动的捕获和处理异常,所以叫做检查异常

异常的捕获

介绍了异常的大概情况,下面我们啊来说说如何捕获处理异常。

try...catch...

首先,我们先想一下,如果没有我们使用最原始的解决异常是个什么办法:

if (异常1) {
    处理
} else if (异常2) {
    处理
} else {
    处理 
}

没错,就是一大长串的if...else,对每种异常情况进行处理。所以这时我们就希望有一种更加强大的if块,可以一下子表示所有的异常情况然后处理掉。这就有了我们的try...catch

try {
    // 业务实现代码
    ...
} catch (Exception e) {
    // 对异常的处理
}

如果try块里的业务逻辑代码出现了异常,系统就会生成一个异常对象,然后将该对象提交给Java运行时环境(throw),接着查找catch块,如果找到了合适的catch块,就将该异常对象交由该catch块处理。这个过程又叫做捕获(catch)异常;如果找不到合适的catch块,程序将退出。

多异常捕获

在Java7之前,对多种的异常只能使用多个catch来进行捕获。

try {
    // 业务实现代码
    ...
} catch (Exception1 e1) {
    ...
} catch (Exception2 e2) {
    ...
} catch (Exception3 e3) {
    ...
}

但是从Java7开始,多个异常可以使用同一个catch来捕获。

注意:

1.多种异常类型之间用竖线“|”隔开。
2.异常变量有隐式final修饰,因此不能对异常变量重新赋值。
3.父类异常要在子类异常以后捕获。
finally回收资源

finally,最终的,也就是我们处理完异常最后要做的事情。由于有时候我们会在try块里面使用一些资源,这些资源最后也就在finally块里被回收掉了。

try {
    // 业务实现代码
} catch (Exception e) {
    // 异常处理
} finally {
    // 资源回收
}

当然了,如果你说我没有使用资源,不想在finally块里做资源回收的操作,也是可以的。

异常链

首先说说为什么会有异常链这种东西。因为对于一个完整的应用而言,都是有比较严格的分层关系的,上层依赖下层的API。而对于用户而言,我们不想看到底层的SQL异常,同时也会使得系统不安全。所以这时我们就要将底层的异常捕获,然后再抛出一个新的业务异常,就可以在新的异常中给出用户比较友好的提示信息。

try {
    // 业务逻辑的实现
} catch (SQLException e) {
    // 记录原始异常
    ...
    // 抛出新的异常
    throw new AnotherException("访问数据库出现异常");
}

或者我们也可以这样处理异常:

try {
    // 业务逻辑的实现
} catch (SQLException ex) {
    // 记录原始异常
    ...
    // 抛出新的异常
    throw new AnotherException(ex);
}

这是由于Throwable基类有了一个可以接受Exception参数的方法。

总结

对于异常的了解,我还处于入门阶段,虽然平时的项目中也会遇到各种各样的异常,然后解决异常,但是也只能说是对异常有了一个了解。这里也是总结一下前人对于异常的经验吧。

1.不要过多的使用try...catch,尽量使用逻辑去规避异常。
2.多重catch块后面,最好再有个catch块用来捕获Exception异常,防止遗漏。
3.尽量去处理异常,不要只是简单的使用printStackTrace()打印异常。

相信随着编程经历的丰富,我对于异常的理解也会有更进一步的提升。期待自己的Java 异常进阶

友情链接:https://www.imooc.com/learn/110

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76747.html

相关文章

  • java学习(八) —— 异常异常处理

    摘要:异常发生时如何处理,提供了解决办法异常处理机制。只要在程序中产生了异常,就会用一个对应类型的异常对象来封装异常,会试图寻找异常处理程序来处理异常。中,异常处理的任务就是将执行控制流从异常发生的地方转移到能够处理这种异常的地方去。 前言 概述:异常就是java程序在运行过程中出现的错误。 异常发生时如何处理,java提供了解决办法:异常处理机制。 java中的异常可以是函数中的语句执行...

    jas0n 评论0 收藏0
  • Java编程思想学习录(连载之:异常

    摘要:系列博文目录编程思想学习录连载之一切都是对象编程思想学习录连载之初始化与清理编程思想学习录连载之内部类编程思想学习录连载之异常本篇文章将讲述关于异常的相关知识注本文首发于公众号,可长按或扫描下面的小心心来订阅基本概念使用异常来提供一致性的错 showImg(https://segmentfault.com/img/remote/1460000013228854); Thinking ...

    pkhope 评论0 收藏0
  • JAVA学习之路 (七)异常

    摘要:阻止当前方法或作用域的,称为异常。一非检查异常和,以及她们的子类。强制要求对这类异常做预备处理使用或者。这样的异常一般是由程序的运行环境导致的。后跟的是异常对象,或者异常对象的引用。 异常 什么是异常 相异与常态,和正常情况下不一致,有错误出现。 阻止当前方法或作用域的,称为异常。 异常分类 showImg(https://segmentfault.com/img/bVbfpnY?w=...

    Nekron 评论0 收藏0
  • Java经典

    摘要:请注意,我们在聊聊单元测试遇到问题多思考多查阅多验证,方能有所得,再勤快点乐于分享,才能写出好文章。单元测试是指对软件中的最小可测试单元进行检查和验证。 JAVA容器-自问自答学HashMap 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可以很好的考察个人基础。但一个这么重要的东西,我为什么没有在一开始...

    xcold 评论0 收藏0
  • “崩溃了?不可能,我全 Catch 住了” | Java 异常处理

    摘要:允许存在多个,用于针对不同的异常做不同的处理。表示程序可能需要捕获并且处理的异常。因此,我们应该尽可能的避免通过异常来处理正常的逻辑检查,这样可以确保不会因为发生异常而导致性能问题。异常表中的每一条记录,都代表了一个异常处理器。 showImg(https://segmentfault.com/img/remote/1460000017918154?w=640&h=100); show...

    stdying 评论0 收藏0

发表评论

0条评论

gghyoo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<