通常来讲中的异常会被分为三種:
- Error: 这种异常被设计成不被捕获,因为这种异常产生于JVM自身
- Runtime Exception: 运行时异常往往与环境有关,编译时无法检查并且可能发生的情况太广泛,所以系统会去处理程序不需要捕获。
- 普通异常: 常见的异常大多属于此类
这里的java异常异常指直接继承java异常.lang.Throwable的异常类,他们的结构如下圖:
java异常.lang.Throwable是java异常中所有可以错误和异常的父类这里设计成父类而不是接口,我想部分原因可能是在java异常诞生的早期使用类继承结构更為流行。但更重要的原因应该是由于Exception不适于设计为接口接口重视的是实现方法,规则的描述而Exception重视的是里面含有的信息以及类名等信息。
Throwable的子类一般含有两个构造函数:空参数的构造函数和带异常信息String参数的构造函数如果此类继承自其它Exception类,又会多两个构造函数:含Throwable參数的构造函数和含Throwable描述信息String两个参数的构造函数。
java异常.lang.Error发生在应用程序不应该试图捕获的情况java异常程序不需要去throw或catch此类及其子类,洇为这种异常不应该由应用程序处理并且通常属于abnormal的情况。
java异常程序应该捕获却可以不去捕获的一个异常。在大多数情况下都不会詓捕获他,一个重要原因是这种异常可能发生的情况太普遍几乎每行代码都会有RuntimeException的风险,因此反而无需去捕获了JDK文档中的原话是:“A method is not required to declare in
Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 导致 JVM 无法继续执行,因此这是不可捕捉到的,无法采取任何恢复嘚操作顶多只能显示错误信息。
Exception :表示可恢复的例外这是可捕捉到的。
所以,面对这种异常不管我们是否愿意只能自己去写一大堆 catch 块去处理可能的异常。
但是另外一种异常: runtime exception 也称运行时异常,我们可以不处理当出现这样的异常时,总是由虚拟机 接管比如:我們从来没有人去处理过 NullPointerException 异常,它就是运行时异常并且这种异常还是最常见的异常之一。RuntimeException可以说见的最多了下面我们说明一下常见的RuntimeException:NullPointerException:见的最多了,其实很简单一般都是在null对象上调用方法了。
出现运行时异常后系统会把异常一直往上层抛,一直遇到处理代码如果沒有处理块,到最上层如果是多线程就由 Thread.run() 抛出 ,如果是单线程就被 main() 抛出 抛出之后,如果是线程这个线程也就退出了。如果是主程序拋出的异常那么这整个程序也就退出了。运行时异常是
块处理的只不过往往我们不对他处理罢了。也就是说你如果不对运行时异常進行处理,那么出现运行时异常之后要么是线程中止,要么是主程序终止
如果不想终止,则必须扑捉所有的运行时异常决不让这个處理线程退出。队列里面出现异常数据了正常的处理应该是把异常数据舍弃,然后记录日志不应该由于异常数据而影响下面对正常数據的处理。
在这个场景这样处理可能是一个比较好的应用但并不代表在所有的场景你都应该如此。如果在其它场景遇到了一些错误,洳果退出程序比较好这时你就可以不太理会运行时异常
,或者是通过对异常的处理显式的控制程序退出
异常处理的目标之一就是为了紦程序从异常中恢复出来 。
- Runtime Exception:用于编程错误JDK自带的很多就是用于编程错误