在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中异常层次结构的简化图。
从上图可以看到,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
试图读取超过文件结尾的内容