https://blog.csdn.net/zh15732621679/article/details/79558864
https://blog.csdn.net/iblade/article/details/78196016
异常类继承关系
Error
- Error类对象
由 Java虚拟机生成并抛出, 一般指与虚拟机相关的问题,如系统崩溃、虚拟机错误、动态链接失败。例如,Java虚拟机运行错误(Virtual MachineError)、OutOfMemoryError、类定义错误(NoClassDefFoundError)、链接错误(LinkageError)。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止,程序不处理error - 错误
通常是使用Error的子类描述
Exception
一般指本应用系统自己由于处理不当或其他原因造成的异常,是可恢复的。
- RuntimeException(运行时异常,不检查异常)
- 由程序员造成,一般是
由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生 -
可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。 - ArrayIndexOutOfBoundsException(
数组下标越界)、NullPointerException(空指针异常)、ArithmeticException(算术异常)、MissingResourceException(丢失资源)、ClassNotFoundException(找不到类)、类型转换异常等异常 - 程序中可以选择捕获处理,也可以不处理,不处理的话,最终会抛给JVM处理
- 由程序员造成,一般是
- 非运行时异常(RuntimeException之外的异常,检查异常)
- 最具代表的检查性异常是
用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件或者上传图片的文件格式错误时,一个异常就发生了,这些异常在编译时不能被简单地忽略, -
属于Exception类及其子类,如IOException、SQLException等以及自定义的Exception异常 -
必须进行处理的异常,否则,程序不能编译通过 - 一般情况下不自定义检查异常
- SQLException:当使用 JDBC 与数据源进行交互的时所遇见的错误,如invalid column name
无效列名
table or view does not exist表或者视图不存在
cannot insert NULL into ()不能将空值插入等
- 最具代表的检查性异常是
异常处理规则
- 异常捕获时要
先捕获小异常,后捕获大异常 - Java7之后支持多异常捕获,多个异常之间使用"|"相隔,
异常变量使用隐式的final修饰,所以异常不能被重新赋值 - 不要将异常处理
用于正常的控制流 -
不要使用过于庞大的try块,一旦try块增大,那么出错的概率就会更大,我们在try块后需要紧跟对不同异常类型的处理,这样就增加了try块的判断逻辑,会降低效率 -
避免使用catch all语句,所有的异常采用同样的处理方式将导致无法对不同的异常分情况处理。 - 不要忽略捕获到的异常,当程序捕获到异常后,我们
不应该仅仅采用输出的方式。
在Effective Java中对异常的使用给出了以下指导原则:
-
对可以恢复的情况使用受检异常,对编程错误使用运行时异常 -
避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生,比如上传图片时,检测文件格式正确与否) 优先使用标准的异常- 每个方法抛出的异常都要有文档
- 保持异常的原子性
- 不要在catch中忽略掉捕获到的异常