下图是java exception的异常结构:
上图简单易懂,需要说明的是
1)Error主要指内部错误和资源运行错误
2)Exception分为RuntimeException和非RuntimeException
3)RunTimeException包括错误的类型转换、数组访问越界、访问空指针
4)Error和RunTimeException叫未检查异常,其他的叫已检查异常
5)Eclipse等编辑器将核查是否为已检查异常,提供异常处理
需要记住以下四种情况才会抛出异常(来自java核心技术一卷):
一个方法必须声明所有可能抛出的已检查异常,未检查异常要么无法控制(Error),要么应该避免其发生(RuntimeException)。当然若方法未声明所有未检查异常,Eclipse一般会提示编译不通过。
如果调用一个抛出已检查异常的方法,必须对它进行处理,或者传递出去。
这两种哪种好呢?通常应该捕获那些如何处理的异常,而将不知道如何处理的异常传递出去,只需在方法首部增加throws声明。后一种并不是一种推卸责任的表现,要知道将异常直接交给能够胜任的处理器进行处理,比压制的处理它好的多。不过有一种特殊情况,如果父类中没有抛出已检查异常,那么子类必须处理,不能传递。
finally一般用于释放资源,注意在其中不要抛出异常。