1 层次结构
Java异常层次结构如下图所示,所有的异常类都是从Throwable继承而来,下一层则分为两个结构,Error和Exception。
Throwable -|<---Error -|<---VirtualMachineError -|<---OutOfMemoryError
| | |<---StackOverflowError
| | |<---UnknownError
| |
| |<---IOError
| |<---AWTError
| |<---ThreadDeath
|
|<---Exception -|<---RuntimeException -|<---IndexOutOfBoundsException
| |<---NullPointerException
| |<---IllegalArgumentException
| |<---ArithmeticException
| |<---ClassCastException
| |<---ConcurrentModificationException
| |<---EmptyStackException
| |<---NoSuchElementException
| |<---BufferOverflowException
| |<---UnknownTypeException
|
|<---ClassNotFoundException
|<---IOException
|<---SAXException
|<---SQLException
|<---InterruptedException
|<---TimeoutException
|<---llegalClassFormatException
|<---DataFormatException
|<---AWTException
2 error异常和exception异常
- Error类层次描述了Java运行时系统的内部错误和资源耗尽错误,在java的虚拟机中发生,用户无需在程序中捕捉或者抛出,属于unchecked exception。
- Exception类异常主要分为两大类:一般异常、RuntimeException。其中RuntimeException属于unchecked exception,一般异常属于checked exception。
3 checked exception和unchecked exception
Java语言规范对这两个定义十分简单,将派生于Error或者RuntimeException的异常称为unchecked异常,所有其他的异常成为checked异常。
checked exception:一般是指程序不能直接控制的外界情况,是指在编译的时候就需要检查的一类exception,用户程序中必须采用try catch机制处理或者通过throws交由调用者来处理。
unchecked exception:是指那些不需要在编译的时候就要处理的一类异常。在java体系里,所有的Error以及RuntimeException及其子类都是unchecked异常。
4 为什么要对unchecked异常和checked异常进行区分?
编译器将检查是否为所有的checked exception提供了异常处理机制,比如说我们使用Class.forName()来查找给定的字符串的class对象的时候,如果没有为这个方法提供异常处理,编译是无法通过的。
5 我们应该对哪些异常进行声明?
Java规范中并没有对unchecked exception是否抛出进行限制,unchecked exception要么是可以避免的(Runtime Exception),要么是不可控制的。