Java 异常
异常是在程序执行过程中发生的意外事件。在本教程中,我们将学习 Java 中的异常。我们将介绍 Java 中的错误、异常和不同类型的异常。
在本教程中,我们将学习 Java 中的异常。我们将介绍 Java 中的错误、异常和不同类型的异常。
异常是在程序执行过程中发生的意外事件。它会影响程序指令的流动,从而导致程序异常终止。
发生异常的原因有很多,比如:
- 无效的用户输入
- 设备故障
- 网络连接丢失
- 物理限制(磁盘内存不足)
- 代码错误
- 打开不可用的文件
Java 异常层次结构
Java 异常可以分为受检查的异常和不受检查的异常。受检查的异常是编译阶段要求你必须捕获的异常,不受检查的异常编译不会检查异常是否捕获。
下图 Java 中异常层次结构的简化图。
从上图可以看出, Throwable
类是 Java 异常层次结构中的根类。Java 异常层次结构分为两个分支:错误 Error
和异常 Exception
。 异常 Exception
下有很多子类来应对不同的异常情况。
其中 Error
和 RuntimeException
是不受检查的异常,其他的都是受检查的异常。
错误 Error
错误 Error代表不可恢复的情况,例如 Java 虚拟机 (JVM) 内存不足、内存泄漏、堆栈溢出错误、库不兼容、无限递归等。
从上面的异常类层次图可以看出 Error
是不受检查的异常。因为错误通常超出了程序员的控制范围,我们不应该尝试处理错误。
异常 Exception
Exception
是受检查的异常, Exception
和它的子类(除 RuntimeException
及其子类)都必须使用 try...catch
捕获和处理。
当程序中发生异常时,Java 会创建一个异常对象。它包含有关异常的信息,例如异常的名称和描述以及发生异常时程序的状态。
我们将在下一个教程中学习如何处理这些异常。在本教程中,我们现在将关注 Java 中不同类型的异常。
Java 异常类型
上面说过,异常可以分为受检查的异常和不受检查的异常。 RuntimeException
和它的子类都是不受检查的异常,其他的 Exception
类和 Exception
的除 RuntimeException
外的所有子类都是受检查的异常。
异常 Exception
的子类主要分为两部分: 运行时异常 RuntimeException
和其他异常。
RuntimeException
是运行时异常,IOException
是输入输出相关的异常,是一种非运行时异常。
运行时异常
RuntimeException
及其子类都是运行时异常。这些运行时异常不在编译时检查,而是在运行时检查。一些常见的运行时异常是:
- API 使用不当 -
IllegalArgumentException
- 空指针访问(缺少变量的初始化)-
NullPointerException
- 越界数组访问 -
ArrayIndexOutOfBoundsException
- 将数字除以 0 -
ArithmeticException
你可以这样想:“如果是运行时异常,那是你的错”。
如果你在使用变量之前已经检查变量是否被初始化就不会发生 NullPointerException
异常。
如果你在使用数组索引之前检查了索引是否越界就不会发生 ArrayIndexOutOfBoundsException
异常。
其他异常
Exception
类和 Exception
的除 RuntimeException
外的所有子类都是受检查的异常。编译器在编译时检查它们,并提示程序员处理这些异常。
检查异常的一些示例是:
- 尝试打开一个不存在的文件会导致
FileNotFoundException
- 当发送网络请求时如果网络异常会导致
IOException
- 当使用
Class.forName()
初始化一个对象时,如果对应的类不存在,就会导致ClassNotFoundException
现在我们了解了异常,我们将在下一个教程中学习处理异常。