资讯专栏INFORMATION COLUMN

Java异常体系

vvpvvp / 1943人阅读

摘要:异常体系首先,标志这是一个异常。区分这两类异常主要特性是是否受检。运行时异常虽然可以不进行处理,但是可能导致线程终止或者应用终止。

在使用JdbcTemplate中queryForObject方法的时候抛出一个异常:

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

  queryForObject的内部逻辑是这样的:使用queryForObject时,会查询一个结果,当查询中结果多余一个或者没有都会抛出一个异常IncorrectResultSizeDataAccessException。这个向外抛出的异常为什么不需要我使用try-catch处理或者继续向外抛出呢?下面的图片展示这个异常的继承结构。

Google之后认识到所有运行时异常都可以不向外抛出。为了更加快速的解决问题,决定对Java异常进行更深入的学习。

Java异常体系


  首先,Throwable标志这是一个异常。
  其次,Throwable有两个子类分别是Error和Exception,Error表示的是JVM发生的异常,如内存溢出,这是应用自身程序本身无法处理的异常;而Exception则表示应用程序自身可以处理的异常。
  最后,Exception的子类分为两类,一个是RuntimeException,另外就是其他继承自Exception的异常,如IOException。区分这两类异常主要特性是是否受检。

什么是受检异常,什么是非受检异常?
  本质上,受检异常指的是会受到Java 编译器检测的异常,也就是说当你的一个方法中有抛出一个受检异常时,
你必须对它进行处理,使用try-catch或者向上抛出进行处理。非受检异常指的是不会受到Java编译器检测的异常,
当你的一个方法中抛出了非受检异常时,你不需要进行处理。
 
 Java意图上使用非受检异常来表示由于软件开发人员导致的错误,如NullPointerException;而使用
受检异常来表示一些用户误操作的错误,如IOException。“The Java Tutorial”告诉我们通常情况下我们
应该抛出受检异常,而不要抛出非受检异常。

  想一想,如果是来自外部的数据有错误,我们可以抛出异常来说明用户传入的参数有错误;而如果是开发人员导致的
错误,且我们开发人员自己都知道自己的代码有异常,那直接改正不久好了,干嘛还要向外抛出呢!所以通常是不会
继承非受检异常的。

  运行时异常虽然可以不进行处理,但是可能导致线程终止或者应用终止。如果是非主线程,则由Thread.run()抛出异常后,线程终止。如果是主线程(即main方法)抛出异常,则应用终止。

有兴趣可以将下面的代码复制到编译器中来检测受检异常和非受检异常。

public class Main {
    public void caller() {
        callee();
    }

    public void callee() throws Exception{
        throw new Exception();
    }
}

上面的代码中在调用callee方法的时候将编译不过。

public class Main {
    public void caller() {
        callee();
    }

    public void callee(){
        throw new RuntimeException();
    }
}

上面的代码将不会有任何告警。

参考:
Java 的 Checked 和 Unchecked Exception【译】

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

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

相关文章

  • Java 异常实战

    摘要:不过按照经验来说,这类异常要么尽量避免,要么出现了就要做异常处理,从而保证程序的健壮性。业务是千变万化,但是它们可能产生的异常处理方式是不会变化的,按照这个思路去做异常处理即可。 前言:说到异常体系,可能对于一些初入职场的老铁会很头痛,不能够很清晰的描述异常是个什么情况。那么本文将通过打流水仗的方式给大家介绍一下工作中涉及的异常知识。首先能看到本文,说明也对异常是有了解的,所以文章开头...

    libxd 评论0 收藏0
  • Java异常体系

    序 本文主要记录java的异常体系 概览 Exception showImg(https://segmentfault.com/img/bVtn8Z); 分checked exception以及unchecked exception(runtime exception) checked exception除runtime exception外的exception。 ReflectiveOpe...

    davidac 评论0 收藏0
  • 1、异常概述和继承体系 2、原因及处理方式 3、运行时异常 4、重写异常处理 5、Throwable

    摘要:案例演示该句运行时发生了数组索引越界异常,由于没有处理异常,导致程序无法继续执行,程序结束。用来进行某种异常的捕获,实现对捕获到的异常进行处理。运行时期异常一旦发生需要程序人员修改源代码。 01异常的概述 * A: 异常的概述 * a:什么是异常 * Java代码在运行时期发生的问题就是异常。 * b:异常类 * 在Java中,把异常信息...

    GT 评论0 收藏0
  • Java009-异常处理

    摘要:异常,可以有针对性的处理方式无论是错误还是异常,它们都有具体的子类体现每一个问题,它们的子类都有一个共性,就是都以父类名才作为子类的后缀名。特殊情况对应多个时,如果有父类的语句块,一定要放在下面。声明的原因是需要调用者对该异常进行处理。 异 常:★★★★异常:就是不正常。程序在运行时出现的不正常情况。其实就是程序中出现的问题。这个问题按照面向对象思想进行描述,并封装成了对象。因为问题的...

    付伦 评论0 收藏0
  • java 异常学习

    摘要:因为是由虚拟机自动抛出并自动捕获,所以又叫非检查异常。多异常捕获在之前,对多种的异常只能使用多个来进行捕获。注意多种异常类型之间用竖线隔开。多重块后面,最好再有个块用来捕获异常,防止遗漏。期待自己的异常进阶。 异常的体系机构 Java提供了丰富的异常类,而这些异常类之间又有这严格的继承关系。下面让我们看一下Java中异常的体系结构。 showImg(https://segmentfau...

    gghyoo 评论0 收藏0

发表评论

0条评论

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