Throwable
:异常的基类,所有异常都继承自java.lang.Throwable
类,Throwable
类有两个直接子类:Error
类和Exception
类。Error
:是 Java 应用程序本身无法恢复的严重错误,应用程序不需要捕获、处理这些严重错误。通常情况下,程序员无需处理此类异常。Exception
:由 Java 应用程序抛出和处理的非严重错误(即异常),也是我们本章重点学习的对象。异常可分为运行时异常(RuntimeException
)和检查时异常(CheckedException
)两种。RuntimeException
:运行时异常,即程序运行时抛出的异常,程序员在编程时即使不做任何处理,程序也能通过编译。前面数组下标越界异常和除数为 0 的异常都是运行时异常。CheckedException
:检查时异常,又称为非运行时异常,这样的异常要求程序员必须在编程时进行处理,否则就会编译不通过。需要特别注意的是,在 JDK 的异常定义体系中(即在所有Throwable
的子类中),并不存在真正的CheckedException
类。也就是说,上图中的所有类名,都能在 JDK 中找到对应的 API,但唯独CheckedException
类并不是真实存在的。一般而言,如果一个类继承自RuntimeException
,就称此类为运行时异常;反之,如果一个类没有继承RuntimeException
,但继承了Exception
或Throwable
,就称此类为检查时异常。
常见异常
NullPointerException
:空指针异常(程序员经常会遇到)属于运行时异常。解释为程序遇到了空指针,简单地说,就是调用了未经初始化的对象或者不存在的对象,或是访问或修改 null 对象的属性或方法。比如说,对数组操作时出现空指针,很多情况下是程序员把数组的初始化和数组元素的初始化混淆了,如果在数组元素还没有初始化的情况下调用了该数组元素,则会抛出空指针异常。ClassNotFoundException
:见名知义,该异常为类没能找到的异常。出现这种情况一般有三种原因:一是的确不存在该类;二是开发环境进行了调整,例如类的目录结构发生了变化,编译、运行路径发生了变化等;三是在修改类名时,没有修改调用该类的其他类,导致类找不到的情况。IllegalArgumentException
:抛出该异常表明向方法传递了一个不合法或不正确的参数。InputMismatchException
:由Scanner
抛出,表明Scanner
获取的内容与期望类型的模式不匹配,或者该内容超出期望类型的范围。例如需要输入的是能转换为int
型的字符串,结果却输入了 abc,则会抛出这个异常。IllegalAccessException
:当应用程序试图创建一个实例、设置或获取一个属性,或者调用一个方法,但当前正在执行的方法无法访问指定类、属性、方法或构造方法的定义时,抛出IllegalAccessException
。ClassCastException
:当试图将对象强制转换为不是实例的子类时,抛出该异常。SQLException
:提供关于数据库访问错误或其他错误信息的异常。IOException
:当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类。
IllegalAccessException 是访问权限不足构成的异常;ClassCastException 是类型转换异常;InputMismatchException 通常是使用 Scanner 输入数据时发生的异常。