关注我们有助于升职加薪噢!

点击上方关注 “Java研究所” 设为“星标”,和你一起掌握更多数据库知识

大家好,这里是java研究所。

今天给大家来个经典面试题:Throwable、Exception、Error、RuntimeException到底有什么区别?

先看一下类图

Throwable类

Throwable是所有异常和错误的祖先。 Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。

Error类(表示错误)

是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(VirtualMachineError)、类定义错误(NoClassDefFoundError)等。

Exception类(表示异常)

是程序本身可以处理的异常,这种异常可以通过try catch捕获进行干预恢复。 Exception又分为2类: 非检查异常:RuntimeException及其子类型的异常,也叫运行时异常

  1. 检查异常:Exception中除了RuntimeException之外的异常
  2. 非检查异常 RuntimeException 的特点

1、方法声明中不需要使用throws进行抛出

可以直接写成下面这样

2、可以try catch也可以不用try catch

m1内部抛出了RuntimeException异常,m2调用了m1,但是m2内部不用强制使用try catch捕获m1抛出的异常。

public static void m1(){
    throw new RuntimeException("运行时异常,方法声明中不需要throws");
}

public static void m2(){
    m1();
}

3、RuntimeException 类型的异常通常是程序bug

RuntimeException 类型的异常通常是指运行时异常,这种异常通常是调用方无法处理的异常,意思是即使捕获了这种类型的异常,也是处理不了的,通常这种异常是程序的一些bug导致的,比如数组越界异常:ArrayIndexOutOfBoundsException,空指针异常:NullPointerException;程序遇到这种异常之后,应该让程序终止运行,不过可以记录错误信息,方便排错。

检查异常的特点

Exception中除了RuntimeException之外的异常都成为检查异常,通常出现这种异常的时候,是希望调用方进行捕获的,可以做一些恢复处理。比如连接数据的错误:SQLException,可能是由于网络原因导致数据库连接不上,此时通过try catch之后,再进行重试,是可以恢复的。

1、方法声明中需要使用throws进行抛出

m1方法中抛出了一个Exception异常,编译器标红了,表示编译是有问题的,因为内部抛出了一个受检查类型的异常,此时方法声明中必须抛出。 必须要在方法声明上加上throws 异常部分,如下: image-20200826180015762](img/image-20200826180015762.png)

2、调用方要么继续向外抛,要么try catch进行捕获,否则会编译器会报错

//方式1:m2中将m1抛出的异常继续向外抛
public static void m2() throws Exception {
    m1();
}

//方式2:m2中捕获m1抛出的异常
public static void m2() {
    try {
        m1();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

使用建议

  1. 如果你抛出的异常,是调用者无法处理的,无法进行恢复的,那么使用RuntimeException类型异常
  2. 如果你抛出的异常,调用者捕获之后,可以进行恢复的,那么使用非RuntimeException类型的异常
  3. 不管异常能不能处理,我们都可以进行捕获,记录异常信息,便于排错

总结

  1. Throwable是java中所有异常以及错误的祖先,其下面主要有2个分类:Exception和Error
  2. Error是程序无法处理的异常,是java虚拟机内部产生的一些无法恢复的错误,这种错误对于程序来说是无能为力的,只能让jvm退出
  3. Exception是程序可以处理的异常,主要有2种分类:检查异常和非检查异常
  4. 非检查异常:也称为运行时异常,由RuntimeException及其子类来表示,这种类型的异常,通常是程序的一些bug,调用方也无能为力,RuntimeException类型的异常不需要强制捕获,不需要在方法定义后面使用throws进行抛出。
  5. 检查异常:也称为非运行时异常,Exception中除了RuntimeException及RuntimeException子类之外的异常属于这类异常,调用方对于这种异常要么捕获要么继续向外抛;通常是希望调用方能够对这种异常进行干预进而进行恢复。
  6. 如果你抛出的异常,是调用者无法处理的,无法进行恢复的,那么使用RuntimeException类型异常,否则使用检查类的异常。

或许你还想看

  1. B站上有哪些值得推荐学习的视频?
  2. 经典面试题:重写equals方法时,为什么必须重写hashCode方法?
  3. 经典面试题:HashMap的默认容量为什么是16 ?
  4. 经典面试题:Arraylist和Linkedlist到底有什么区别???
  5. 经典面试题:NoClassDefFoundError 和 ClassNotFoundException 有什么区别? ·END· 扫描二维码 | 关注我们