带你整理面试过程中关于 Java 中的 异常分类及处理的相关知识

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你整理面试过程中关于 Java 中的 异常分类及处理的相关知识相关的知识,希望对你有一定的参考价值。

文章目录

一、异常的概念

异常指在方法不能按照正常方式完成时,可以通过抛出异常的方式退出该方法,在异常中封装了方法执行过程中的错误信息及原因,调用方在获取该异常后可根据业务的情况选择处理该异常或者继续抛出该异常。

在方法在执行过程中出现异常时,Java异常处理机制会将代码的执行权交给异常处理器,异常处理器根据在系统中定义的异常处理规则执行不同的异常处理逻辑(抛出异常或捕捉并处理异常)。

详细内容可参考学习:一篇文章带你搞定 Java 中异常的基本概念

二、异常分类

在Java中,Throwable是所有错误或异常的父类,Throwable又可分为Error和Exception,常见的Error有AWTError、ThreadDeath,Exception又可分为RuntimeException和CheckedException,如图2-6所示。


Error指Java程序运行错误,如果程序在启动时出现Error,则启动失败;如果程序在运行过程中出现Error,则系统将退出进程。出现Error通常是因为系统的内部错误或资源耗尽,Error不能被在运行过程中被动态处理。如果程序出现Error,则系统能做的工作也只能有记录错误的成因和安全终止

Exception指Java程序运行异常,即运行中的程序发生了人们不期望发生的事件,可以被Java异常处理机制处理。Exception也是程序开发中异常处理的核心,可分为RuntimeException(运行时异常)和CheckedException(检查异常),如图2-7所示。


(1)RuntimeException:指在Java虚拟机正常运行期间抛出的异常,RuntimeException可以被捕获并处理,如果出现RuntimeException,那么一定是程序发生错误导致的。我们通常需要抛出该异常或者捕获并处理该异常。常见的RuntimeException有NullPointerException、ClassCastException、ArrayIndexOutOf BundsException等。

(2)CheckedException:指在编译阶段Java编译器会检查CheckedException异常并强制程序捕获和处理此类异常,即要求程序在可能出现异常的地方通过try catch语句块捕获并处理异常。常见的CheckedException有由于I/O错误导致的IOException、SQLException、ClassNotFoundException等。该类异常一般由于打开错误的文件、SQL语法错误、类不存在等引起。

三、异常处理方式:抛出异常、使用 try catch捕获并处理异常

异常处理方式有抛出异常和使用try catch语句块捕获并处理异常这两种方式。

(1)抛出异常:遇到异常时不进行具体处理,而是将异常抛给调用者,由调用者根据情况处理。有可能是直接捕获并处理,也有可能是继续向上层抛出异常。抛出异常有三种形式:throws、throw、系统自动抛出异常。其中,throws作用在方法上,用于定义方法可能抛出的异常;throw作用在方法内,表示明确抛出一个异常。具体的使用方法如下:


以上代码首先验证字符串的长度,如果长度不够,则通过throw关键字在方法内抛出一个StringIndexOutOfBoundsException异常,同时定义了一个div方法,使用throws关键字在该方法上定义一个异常。

(2)使用try catch捕获并处理异常:使用try catch捕获异常能够有针对性地处理每种可能出现的异常,并在捕获到异常后根据不同的情况做不同的处理。其使用过程比较简单:用try catch语句块将可能出现异常的代码包起来即可。具体的使用方法如下:

throw和throws的区别如下:

  • 位置不同:throws作用在方法上,后面跟着的是异常的类;而throw作用在方法内,后面跟着的是异常的对象。
  • 功能不同:throws用来声明方法在运行过程中可能出现的异常,以便调用者根据不同的异常类型预先定义不同的处理方式;throw用来抛出封装了异常信息的对象,程序在执行到throw时后续的代码将不再执行,而是跳转到调用者,并将异常信息抛给调用者。也就是说,throw后面的语句块将无法被执行(finally语句块除外)。

throw 和 throws 的具体使用可参考:一篇文章带你搞定 Java 中 throws 与 throw 关键字的区别

四、面试提问

【1】throw 和 throws 的区别 ?

【2】final、finally、finalize 有什么区别?

  • final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。
  • finally:是 try catch finally 最后一部分,表示不论发生任何情况都会执行,finally 部分可以省略,但如果 finally 部分存在,则一定会执行 finally 里面的代码。
  • finalize: 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。

【3】try-catch-finally 中哪个部分可以省略?

try-catch-finally 其中 catch 和 finally 都可以被省略,但是不能同时省略,也就是说有 try 的时候,必须后面跟一个 catch 或者 finally。

【4】try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

finally 一定会执行,即使是 catch 中 return 了,catch 中的 return 会等 finally 中的代码执行完之后,才会执行。

【5】常见的异常类有哪些?

NullPointerException 空指针异常
ClassNotFoundException 指定类不存在
NumberFormatException 字符串转换为数字异常
IndexOutOfBoundsException 数组下标越界异常
ClassCastException 数据类型转换异常
FileNotFoundException 文件未找到异常
NoSuchMethodException 方法不存在异常
IOException IO 异常
SocketException Socket 异常

【6】如何抛出空指针异常,如何产生该异常?(阿里)

空指针异常属于运行时异常,需要对它进行捕获或者抛出
抛出:Throws 或者 Throw
捕获:try…catch
产生:没有对new 出来的对象进行实例化,或者从数据库查询一个空对象;对象为null的情况下调用它的方法或者成员变量

以上是关于带你整理面试过程中关于 Java 中的 异常分类及处理的相关知识的主要内容,如果未能解决你的问题,请参考以下文章

带你整理面试过程中关于多线程中的线程池的相关知识点

带你整理面试过程中关于Java 中多线程的创建方式的最全整理

带你整理面试过程中关于 Java 中的集合 List,Queue,Set的相关知识点

带你整理面试过程中关于锁的相关知识点上(synchronizedReentrantLock)

带你整理面试过程中关于锁升级的过程

带你整理面试过程中关于 Mybatis 底层的相关知识