首先,java异常的树状图如下
很明显,由图就可以看出,异常都是派生自Throwable类的一个实例,Throwable类主要有两大子类,分别为Error类和Exception类,Error类描述的是java程序运行时系统的内部错误和资源耗尽错误,当错误发生的时候,除了通知用户,使程序尽可能安全终止外,我们无能为力,因此这类异常我们也不需要抛出。
我们需要重点关注的应该是Exception类,而Exception主要分为两大子类,RuntimeException和非RuntimeException类,划分的依据主要是,由程序导致的异常属于RuntimeException异常,而曾经能够运行,由于某些原因不能运行的(比如io异常)导致的异常不属于RuntimeException异常。派生自RuntimeException类的异常主要有以下几种情况:
1.错误的类型转换(ClassCastException)
2.数组的越界访问(ArrayIndexOfBoundsException)
3.访问空指针(NullPointerException)
而非派生自RuntimeException的异常主要有以下几种情况:
1.试图在文件末尾读取数据(EOFException)
2.试图打开一个错误格式的URL(MalformedURLException)
3.试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在(ClassNotFoundException)
将派生自Error和Runtimexception类的异常称为未检查(unchecked)异常,将其他类称为检查(checked)异常;针对检查异常,是需要提供异常处理的,声明异常或者捕获异常。声明异常的时候,一定不能声明派生自Error或者RuntimeException类的异常;子类继承超类的方法后,抛出的异常的范围一定要比超类的范围小,如果超类不抛出检查型异常,子类也不能抛出。
try catch是可以不一起使用的,finally内的代码无论是否捕获到异常,都会执行,一般会将一些资源的释放放到finally里,其实比较推荐将try catch和try finally独立使用,比如
InputStream in=...;
try{
try{
}finally{
in.close();
}
}catch(IOException e){
}
参考书籍:java核心编程思想卷一