异常是指由于各种无法预知的情况,导致程序中断运行的一种指令流,如:文件找不到、非法参数、网络超时等。为了保证程序的正常运行,在设计程序时必须考虑到各种异常情况,并正确的对异常进行处理。异常也是一种对象,Java
当中定义了许多异常类,并且定义了基类java.lang.Throwable
作为所有异常的超类。Java
语言设计者将异常划分为两类:Error
和Exception
, 其体系结构大致如下图所示:
Throwable
有两个重要的子类:Exception
(异常)和Error
(错误),两者都包含了大量的异常处理类:
Error
(错误):是程序中无法处理的错误,表示运行应用程序中出现了严重的错误,此类错误一般表示代码运行时JVM
出现问题。 通常有Virtual MachineError
(虚拟机运行错误)、NoClassDefFoundError
(类定义错误)等。比如说当JVM
耗完可用内存时,将出现OutOfMemoryError
。此类错误发生时,JVM
将终止线程。这些错误是不可查的,非代码性错误。因此,当此类错误发生时,应用不应该去处理此类错误;Exception
(异常):程序本身可以捕获并且可以处理的异常;Exception
这种异常又分为两类:运行时异常和编译异常
RuntimeException
类极其子类表示JVM
在运行期间可能出现的错误。 比如说试图使用空值对象的引用(NullPointerException
)、数组下标越界(ArrayIndexOutBoundException
)。此类异常属于不可查异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理;Exception
中除RuntimeException
极其子类之外的异常。如果程序中出现此类异常,比如说IOException
,必须对该异常进行处理,否则编译不通过。 在程序中,通常不会自定义该类异常,而是直接使用系统提供的异常类。在Java
应用中,异常的处理机制分为抛出异常和捕获异常:
Java
源代码抛出异常、自己编写的代码抛出异常等;Exception Handler
)来处理该异常。所谓合适类型的异常处理器指的是异常对象类型和异常处理器类型一致;对于不同的异常,Java
采用不同的异常处理方式:
Error
,该异常一旦发生JVM
将自行处理该异常,因此Java
允许应用不抛出此类异常;try-catch
捕获,要么使用该方法使用throws
将该异常抛调用该方法的上层调用者。