浅谈Java异常处理机制

前言

  在 Java 中,异常被当作对象来处理,所有的异常都有一个共同的祖先java.lang.Throwable类。Throwable有两个重要的子类Exception(异常) 和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。先从整体看看异常类层次结构图,使我们对异常体系有一个大概的认识:

Java异常类层次结构图,来源于参考文献1.

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

  Exception:是程序本身可以处理的异常,它有一个重要的子类 RuntimeException。RuntimeException 异常由Java虚拟机抛出,主要指编码、环境或者用户操作输入出现问题。

  注意,异常和错误的区别:异常能被程序本身处理,错误是无法处理的。使用try-catch-finally捕获异常,其捕获语法如下:

try {
     需要被检测的代码;
} catch(异常类 变量名) {
     异常处理代码;
} fianlly {
      一定会执行的代码;
}

异常分类

  总体上我们根据Javac对异常的处理要求,将异常类分为2类,即非受检查异常和受检查异常。

  不受检查异常(unckecked exception):Error 和 RuntimeException 以及它们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序中处理这些异常。此类异常的出现常常是代码本身有问题造成的,应该从业务逻辑层面去解决并改进代码,而不是去通过异常处理机制解决。如分母为零的算术异常ArithmeticException,使用了空对象NullPointerException等等。

  受检查异常(checked exception):除了 Error 和 RuntimeException的其它异常。javac强制要求程序员处理这样的异常,要么用try-catch语句捕获,要么用throws子句声明抛出;否则,直接导致编译失败。这样的异常一般是由程序的运行环境导致的,因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用这些程序,于是就应该为这样的异常时刻准备着如FileNotFoundException 等。

  需要明确的是:受检查和非受检查是对于javac来说的,这样就很好理解和区分了。

常见异常及其分类

  面试官也可能让你举出几个常见的异常情况并将其分类,未雨绸缪,下面列出了一些 Java 中常见的异常及其分类。

RuntimeException

  1. 数组下标越界异常 ArrayIndexOutOfBoundsException;

  2. 空指针异常 NullPointerException;

  3. 类型转换异常 ClassCastException;

  4. 非法参数异常 IllegalArgumentException。

UncheckedException

  1. 指定变量不存在异常 NoSuchFieldException 。

常见问题

  1. Excption与Error的关系是什么?
    Excption与Error都是Throwable的子类。
    Error和Exception的区别:Error通常是灾难性的、致命的错误,是程序无法控制和处理的。当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程。Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的捕获这些异常。

  2. 如何自定义一个异常?
    通过继承一个异常类自定义异常,运行时异常继承 RuntimeException,编译时异常继承 Exception。

  3. try-catch-finally,try中有return,finally还执行吗?
    执行。finally代码块的执行在return之前,不管try中是否有异常,它都执行。温馨提示,如果finally中有return,则会在try的return之前执行,导致不执行try中的return。

  4. throw 和throws关键字的区别
    throw用于在函数内抛出异常对象,后面跟的是异常对象。
    throws用于在方法声明上抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。

  例如:

static void demoException() throws Exception {
     throw new Exception("error msg");
}
  1. 举个内存溢出的例子
public static void main(String[] args) {
      //java.lang.OutOfMemoryError 内存溢出错误
   byte[] buf = new byte[1024*1024*700];
}

小结

  以上就是这篇文章的全部内容了,希望本文对大家的学习或者工作能带来一定的帮助,如有疑问请留言交流。Wiener在此祝各位生活愉快!工作顺利!

Reference

1.  https://www.cnblogs.com/lulipro/p/7504267.html

posted @ 2021-03-07 15:23  楼兰胡杨  阅读(175)  评论(0编辑  收藏  举报