Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。

Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。

Exception

程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。

可检查(checked)

是编译期检查的一部分,必须在代码里显式进行捕获处理。
IOException

异常 描述
ClassNotFoundException 找不到相应的类
InterruptedException 线程被另一个线程中断
NoSuchFieldException 变量不存在
NoSuchMethodException 方法不存在

不检查(unchecked)

就是运行时异常,并不会在编译器强制要求。需要根据自己的判断捕获并处理。
常见:

异常 描述
NullPointerException 空指针
ArrayIndexOutOfBoundsException 访问数组越界
ClassCastExcception 类型转换不兼容
ArithmeticException 运算异常
ArrayStoreException 数组存储对象类型错误
IllegalArgumentException 方法接收了不合法的参数
NumberFormatException 不能转换成数值类型的字符串

Error

Error 及其子类都属于 unchecked exceptions
Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。

VirtualMachineError

java 虚拟机内部异常

OutOfMemoryError
StackOverflowError:线程的堆栈大小超过了内存分配限制
InternalError
UnknownError

LinkageError

加载异常

NoClassDefFoundError :Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误

ClassNotFoundException与NoClassDefFoundError区别

ClassNotFoundException 是在编译时就找不到类
NoClassDefFoundError 是运行时找不到,这个类存在,但对类加载器不可见

  • 发生这个错误是没有把类加入到 classapath 中,或在 classpath 中不可用。
    • 最常见可能是静态初始化类失败导致
    • 启动脚本覆盖了原来的 classpath 变量