Java把异常当作对象来处理,并定义一个基类java.lang.Throwable做为全部异常的超类。Java中的异常分为两大类:错误Error和异常Exception,Java异常体系结构以下图所示:java
Throwable类是全部异常或错误的超类,它有两个子类:Error和Exception,分别表示错误和异常。其中异常Exception分为运行时异常(RuntimeException)和非运行时异常,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。数组
通常是指java虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态连接失败等,这种错误没法恢复或不可能捕获,将致使应用程序中断,一般应用程序没法处理这些错误,所以应用程序不该该捕获Error对象,也无须在其throws子句中声明该方法抛出任何Error或其子类。多线程
一般,Java的异常(包括Exception和Error)分为可查的异常(checked exceptions)和不可查的异常(unchecked exceptions)。
可查异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常情况。可查异常虽然是异常情况,但在必定程度上它的发生是能够预计的,并且一旦发生这种异常情况,就必须采起某种方式进行处理。
除了RuntimeException及其子类之外,其余的Exception类及其子类都属于可查异常。这种异常的特色是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,不然编译不会经过。
不可查异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。ide
若是使用throw在方法体中抛出可查异常,则须要在方法头部声明方法可能抛出的异常类型。程序会在throw语句后当即终止,它后面的语句执行不到,而后在包含它的全部try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。函数
(1)运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中能够选择捕获处理,也能够不处理。这些异常通常是由程序逻辑错误引发的,程序应该从逻辑角度尽量避免这类异常的发生。spa
当出现RuntimeException的时候,咱们能够不处理。当出现这样的异常时,老是由虚拟机接管。好比:咱们历来没有人去处理过NullPointerException异常,它就是运行时异常,而且这种异常仍是最多见的异常之一。
出现运行时异常后,若是没有捕获处理这个异常(即没有catch),系统会把异常一直往上层抛,一直到最上层,若是是多线程就由Thread.run()抛出,若是是单线程就被main()抛出。抛出以后,若是是线程,这个线程也就退出了。若是是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有通常异常的特色,是能够被catch块处理的。只不过每每咱们不对他处理罢了。也就是说,你若是不对运行时异常进行处理,那么出现运行时异常以后,要么是线程停止,要么是主程序终止。
若是不想终止,则必须捕获全部的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,而后记录日志。不该该因为异常数据而影响下面对正常数据的处理。线程
(2)非运行时异常是RuntimeException之外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。对于这种异常,JAVA编译器强制要求咱们必需对出现的这些异常进行catch并处理,不然程序就不能编译经过。因此,面对这种异常无论咱们是否愿意,只能本身去写一大堆catch块去处理可能的异常。日志
来看看下面这个test1()方法:对象
public int test1() { try { return 1; } finally { return 2; } }
方法test1将返回2;blog
怎么解释呢?再来看看下面这个test2()方法:
public int test2() { int i = 1; try { System.out.println("try语句块中"); return 1; } finally { System.out.println("finally语句块中"); return 2; } }
运行结果是:
try语句块中
finally语句块中
2
从运行结果中能够发现,try中的return语句调用的函数先于finally中调用的函数执行,也就是说return语句先执行,finally语句后执行,因此,返回的结果是2。return并非让函数立刻返回,而是return语句执行后,将把返回结果放置进函数栈中,此时函数并非立刻返回,它要执行finally语句后才真正开始返回。
ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常
ClassCastException 试图将对象强制转换为不是实例的子类时,抛出该异常
IllegalArgumentException 抛出的异常代表向方法传递了一个不合法或不正确的参数
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出
NoSuchElementException 代表枚举中没有更多的元素
NullPointerException 当应用程序试图在须要对象的地方使用 null 时,抛出该异常
java.io.NotSerializableException 代表序列化或反序列化时出错
java.util.ConcurrentModificationException 集合遍历快速失败