Java 异常(Exceptions)

在Java中异常被当做对象来处理,根类是java.lang.Throwable类,在Java中定义了很多异常类(如OutOfMemoryError、NullPointerException、IndexOutOfBoundsException等),这些异常类分为两大类:Error和Exception。

  • Error是无法处理的异常,比如OutOfMemoryError,一般发生这种异常,JVM会选择终止程序。因此我们编写程序时不需要关心这类异常。

  • Exception,也就是我们经常见到的一些异常情况,比如NullPointerException、IndexOutOfBoundsException,这些异常是我们可以处理的异常。

  • Exception类的异常包括checked exception和unchecked exception(unchecked exception也称运行时异常RuntimeException,当然这里的运行时异常并不是前面我所说的运行期间的异常,只是Java中用运行时异常这个术语来表示,Exception类的异常都是在运行期间发生的)。

  • unchecked exception(非检查异常),也称运行时异常(RuntimeException),比如常见的NullPointerException、IndexOutOfBoundsException。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。

  • checked exception(检查异常),也称非运行时异常(运行时异常以外的异常就是非运行时异常),java编译器强制程序员必须进行捕获处理,比如常见的IOExeption和SQLException。对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过。

Java 异常层次结构

这是Java中异常层次结构的简化图。

image.png

从上图可以看到,Throwable类是层次结构中的根类。

请注意,层次结构分为两个分支:错误(Error)和异常(Exception)。

Error

Error表示不可恢复的情况,例如Java虚拟机(JVM)内存不足,内存泄漏,堆栈溢出错误,库不兼容,无限递归等。

错误通常是程序员无法控制的,我们不应该尝试处理错误。

Exception

程序可以捕获并处理异常

当方法内发生异常时,它将创建一个对象。该对象称为异常对象。

它包含有关异常的信息,例如异常的名称和说明以及发生异常时的程序状态。

在下一个教程中,我们将学习如何处理这些异常。在本教程中,我们现在将重点介绍Java中不同类型的异常。

Java异常类型

异常层次结构还具有两个分支:RuntimeException和IOException。

1. RuntimeException

一个运行时异常发生由于编程错误。它们也称为非检查异常

这些异常不在编译时检查,而是在运行时检查。一些常见的运行时异常是:

  • API使用不当 - IllegalArgumentException

  • 空指针访问(缺少变量的初始化)- NullPointerException

  • 越界数组访问 - ArrayIndexOutOfBoundsException

  • 将数字除以0 - ArithmeticException

 你可以这样想:“如果这是一个运行时异常,那就是你的错”。

如果在使用变量之前检查变量是否已初始化,则不会发生NullPointerException。
如果根据数组边界测试数组索引,则不会发生ArrayIndexOutOfBoundsException。

2. IOException

IOException也称为检查异常。它们由编译器在编译时检查,并提示程序员处理这些异常。

检查异常的一些示例是:

  • 尝试打开不存在的文件会导致 FileNotFoundException

  • 试图读取超过文件结尾的内容

编程笔记 » Java 异常(Exceptions)