1.处理异常
在Java中所有异常都是由Throwable继承而来,但在下一层分解为Error和Exception两个分支。Error类层次结构描述了Java运行时系统的内部错误和资源消耗错误。应用程序不应该抛出这种类型的对象。
Exception类层次结构可以分解为两个分支:一个分支是派生于RuntimeException的异常,另一个分支包含其他异常。”如果出现RuntimeException异常,就一定是你的问题。“
Java将派生于RuntimeException类或Error类的所有异常成为“未检查异常”,其他的异常成为“已检查异常”。
遇到下面的情况时才会抛出异常:
(1)调用一个抛出已检查异常的方法,例如,FileInputStream构造器。
(2)在程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常。
(3)程序出现错误,例如,a[-1]=0会抛出ArrayIndexOutOfBoundsException异常这样的未检查异常。
(4)Java虚拟机和运行时库出现的内部异常。
如果一个方法有可能抛出多个已检查异常,就必须在方法的首部列出所有的异常类,每个异常类之间用逗号(,)隔开。但是,不需要声明Java的内部错误,就是从Error继承的哪些异常。同样,也不应该声明从RuntimeException继承的那些未检查异常。
对于一个已经存在的异常类,将其抛出非常容易:(1)找到一个合适的异常类;(2)创建这个类的一个对象;(3)将对象抛出。
如果子类覆盖了超类的一个方法,那么,子类方法中声明的已检查异常不能超过超类方法中声明的异常范围。
2.捕获异常
想要捕获一个异常,就必须设置try/catch语句块。try语句块的最简单的形式如下:
1
2
3
4
5
6
7
8
9
10
|
try
{
code
more code
more code
}
catch
(ExceptionType e)
{
handler
for
this
type
}
|
如果try语句块中的任何代码抛出了一个在catch子句中指定的异常类,那么
1)程序将跳过try语句块中的其余代码。
2)程序将执行catch子句中的处理器代码。
如果在try语句中的代码没有抛出任何异常,那么程序将跳过catch子句。如果方法中的任何代码跑出了一个在catch子句中没有声明的异常类型,那么这个方法将立刻退出。
通常,应该捕获那些知道如何处理的异常,而将不知道如何处理的异常传递出去。如果想将异常传递出去,就必须在方法的首部添加一个throws说明符,以便告知调用者这个方法可能会抛出异常。
参考:
JAVA2核心技术,第11章