专栏首页kk大数据Java Exception 和 Error 有什么区别?你会偷偷吃掉异常而找不到bug吗?

Java Exception 和 Error 有什么区别?你会偷偷吃掉异常而找不到bug吗?

知识导航

异常会伴随着我们开发程序的整个周期,也只有正确处理好这些异常,才能保证程序的可靠性和稳定性。

各个主流编程语言都提供了很完善的异常处理机制,Java 也不例外,今天就梳理一下 Java 的异常。

Java 类库的异常设计

Exception 和 Error 都是继承了 Throwable 类。

throw 和 catch 只能作用在 Throwable 类的实例上。比如:

throw new RuntimeException("Error !");

Exception 和 Error 提现了 Java 设计者对于异常的不同分类。

Exception 是在程序运行过程中,可以预料到的正常情况,应该捕获这些异常,并作出相应的处理。

Exception 又可以分为可检查(Checked)和不可检查(Unchecked)异常。可检查异常是在源代码里必须进行显示的处理,这是编译器检查的一部分;不可检查异常就是运行时异常,如 NullPointerException,ArrayIndexOutOfBoundsException,通常是正确编码就可以解决的异常,可以按需求进行补货。

Error 表示在正常情况下,不大可能出现的情况,会导致程序处于非正常、不可恢复的状态。不便于也不需要捕获,如 OutOfMemoryError,StackOverflowError。

尽量不要捕获 Exception 异常

不要去捕获 Exception 异常,应该去捕获特定异常。应为在日常的开发和团队合作中,读代码的机会会很多,软件工程是门代码合作的艺术,我们有义务让自己的代码能体现出更多的信息,而捕获 Exception 异常恰恰隐藏了我们的意图。

另外也要保证不要捕获到不应该捕获的异常,比如 RuntimeException,你可能更希望这个异常能抛出去。

不要生吞异常

这是非常需要注意的事,比如下面的代码:

try {
   // 业务代码
   // …
} catch (IOException e) {
    e.printStackTrace();
}

printStackTrace 在 JDK 文档中第一句话就是:

Prints this throwable and its backtrace to the standard error stream。

在稍微复杂一点的生产系统中,标准输出不是个合适的选项,一般我们自己也不知道到底输出到哪去了,导致无法找到堆栈轨迹。没有人能够轻易判断到底是哪里出现了异常,以及是什么原因出现了异常。

生吞异常,本质上是不知道该如何处理,掩盖了问题。

最好是使用 第三方日志系统,输出到日志文件中。

Throw early, catch late

来体会下面的一段代码:

public void readFile(String filename) {
  Objects. requireNonNull(filename);
  //...perform other operations... 
  InputStream in = new FileInputStream(filename);
   //...read the preferences file...
}

如果文件名是 null 的话,会抛出空指针异常。所以这里尽早的发现了这个问题,并且抛出了合理的异常出去。实际情况中,可能是配置文件没找到,配置文件格式不对,需要尽早的发现此类问题,尽早的抛出去。

抛出去之后,到底应该怎么捕获呢?可以直接打印日志出去,或者保留原有的 cause,构造新的异常抛出去,在上层逻辑(业务逻辑)中就知道应该做何种处理了。

本文分享自微信公众号 - kk大数据(kkbigdata),作者:王凯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据分析:数据采集是根基

    数据传输,指的是数据以何种方式流入到存储介质,比如日志是通过logstash还是filebeat采集到kafka的,前端的操作记录是通过http请求发送的

    kk大数据
  • Flink 编程接口

    现实世界中,所有的数据都是以流式的形态产生的,不管是哪里产生的数据,在产生的过程中都是一条条地生成,最后经过了存储和转换处理,形成了各种类型的数据集。

    kk大数据
  • 数据分析,你知道维度和指标的区别吗

    指标,是衡量事务发展程度的单位和方法,通常需要经过加和、平均等聚合统计才能得到,并且是在一定条件下的。

    kk大数据
  • 《Monkey Java》课程7.0之Java当中的异常

    GitOPEN
  • 清华学霸直博全自主写CPU、操作系统、编译器!刘知远点赞!(附链接)

    最近,一个来自福州的男生突然火了,原因是知乎上一个热帖《清华大学计算机专业本科的这位同学是什么水平?》:

    数据派THU
  • 清华学霸直博简历火了!CPU、操作系统、编译器全自主写,刘知远点赞

    最近,一个来自福州的男生突然火了,原因是知乎上一个热帖《清华大学计算机专业本科的这位同学是什么水平?》:

    昱良
  • 2个线性表查找的优化

    实际上,如果待查的数据比较均匀,那么1/2是一个很好的选择,一旦待查数据中的数据是极度不均匀的,那么就需要考虑插值查找法。

    大学里的混子
  • 11.Android-Xml读写

    张诺谦
  • 关于弱监督学习,这可能是目前最详尽的一篇科普文

    近年来,机器学习对现实世界的影响与日俱增。在很大程度上,这是由于各种各样的深度学习模型的出现,使得从业人员可以在不需要任何手动操作特征工程的情况下,就可以在对比...

    AI科技评论
  • 弱监督学习——这是目前最详尽的一篇科普文

    随着人工智能技术的研究迈过了初期的野蛮生长,走进深水区。如何充分利用人工标注信息、减小标注工作量、将人类经验与学习规则充分结合成为了急需解决的关键问题!本文结合...

    商业新知

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动