异常体系(图片转载)
在异常体系中有一个父类,就像Object是所有类的父类一样,Throwable就是所有异常的父类。它只有两个子类分别叫做Error和Exception,它们又称作错误和异常。
Exception——异常
Exception异常类又可以分为运行时异常(RuntimeException)和非运行时异常。
运行时异常
运行时异常如名字一样,是在运行是才会影响程序运行的异常。所以,在编译过程中是不会像非运行时异常一样直接报错的。因此,运行时异常又被称之为不检查异常(Unchecked Exception)
运行时异常一般是因为逻辑错误导致的所以,在编写代码的过程中是可以处理,也可以不处理。
通常的运行时异常都是Runtime Exception的类及其子类。
常见的运行时异常有:
- ClassCastException(类型转换异常)
- IndexOutOfBoundsException(数组越界)
- NullPointerException(空指针)
- ArrayStoreException(数据存储异常,操作数组时类型不一致)
非运行时异常
非运行时异常也叫检查异常(checked Exception),它是在编译、编写代码时就会提示的异常。出现这种异常必须被捕获(try-catch)或者抛出(throw、throws)。
一般的非运行时异常是Exception的子类
常见的非运行时异常有:
- IOException
- SQLException
- 用户自定义的Exception异常,一般情况下不自定义检查异常。
Error——错误
错误一般是由程序员编写时,没有注意相关情况主观导致的。当错误发生时,JAVA虚拟机一般情况下会停止线程的运行。
例如:在申请数组空间是,申请的空间大于剩余内存空间,造成堆内存泄漏。
异常的处理
关于异常的处理一般有try、catch、finally、throw以及throws等5个关键词。
try:运行的代码,需要监控的代码块。当出现异常后会将异常抛出。
catch:当捕捉到异常后,它会和自己的异常进行匹配,如果匹配就会运行就会运行catch中的代码。在使用过程中可以有多个
finally:无论是否捕捉到异常,其中的代码都会运行。使用时一组try-catch有且仅有一个finally。
throw:在方法体内部抛出异常,在方法头部也需要声明可能会抛出的异常种类,如果抛出检查异常,则其调用者就必须处理异常。
throws:在方法体外部抛出异常,其调用者同样需要处理该异常(捕获或者抛出)