异常的作用
在程序运行过程中出现错误,导致程序出现非预期场景。异常处理可以保证出现错误后,控制接下来的程序流程,是选择定位错误
信息,还是抛出异常或捕获异常、还是避免程序非正常退出,都取决于我们。
异常体系的引入增加了程序的健壮性。
异常的体系结构
Java的异常体系结构如上图所示,异常的顶级类是Throwable类,它是Object的子类,实现了Serializable接口,在其下,分为以下两大类:
- Error
- Exception
- RuntimeException
- Checked Exception
Error和Exception的区别
Error和Exception都继承自Throwable
- Error:程序无法处理的系统错误,编译器不做检查
- Exception:异常,程序可以处理的异常,捕获后可能恢复
- 前者无法处理,而后者可以处理
- Error属于JVM需要承担的责任,RuntimeException是程序应该承担的责任,Checked Exception是编译器应该承担的责任
Exception
Exception又可以分为RuntimeException(运行时异常)和Checked Exception(也叫受检查异常)。
- RuntimeException:不可预知的,程序应当自行避免
- Checked Exception:可预知的,从编译器效验的异常,不进行处理,编译器会报错
常见的Error和Exception
Error
- NoClassDefFoundError:找不到class定义的错误,可能是类依赖的class文件或者jar包不存在
- StackOverflowError:深递归导致栈被耗尽而抛出的错误
- OutOfMemoryError:内存溢出异常
RuntimeException
- NullPointerException:空指针引用异常
- ClassCastException:类型强制转换异常
- IllegalArgumentException:传递非法参数异常
- IndexOutOfBoundsException:数组下标越界异常
- NumberFormatException:数字格式异常
Checked Exception
- IOException:IO操作异常
- SQLException:SQL语句异常
- ClassNotFoundException:找不到指定class异常