1. Throwable的方法
String getMessage()
String getLocalizedMessage()
String toString()
void printStackTrace()
每个方法都比前一个提供更多的信息
2. 重新抛出异常
catch (Exception e) {
System.err.println(“An exception was thrown”);
throw e;
}
重抛异常会把异常抛给上一级环境中的异常处理程序,同一个try快的后续catch字句将被忽略。
由于只是把当前异常对象重新抛出,printStackTrace()方法显示的将是原来的异常抛出点的调用栈信息,而非重新抛出点的信息。要想更新这个信息,把throw e;改成
throw e.fillInStackTrace();
3. 异常链
有时候你需要处理一个异常并抛出另一个,但仍要保持原异常的信息,这被成为异常链。
Throwable的三个基础子类Error, Exception, RuntimeException都有一个接收cause参数的构造器。如果想建立这三个子类以外的异常链,就得使用initCause()方法。
4. 标准Java异常
Throwable有两个直接子类:Error类代表了系统运行期错误,通常情况不用捕获;Exception类则是Java类库、用户的方法。通常要处理的是Exception。
当然,异常类中最重要的还是类名。
异常并非都在java.lang中,有些还在util, net, io等库中。
5. RuntimeException
RuntimeException通常由Java自动抛出,如
if (reference == null) throw new NullPointerException();
是多余的。
如果一个RuntimeException被抛出后一直到main方法也未被处理,printTraceStack()方法被自动调用。
6. finally
没有垃圾收集器或析构函数自动调用的语言中,finally的重要性在于释放内存。而Java中finally则多用在使对象恢复到原来的状态,如打开的文件、网络连接,在屏幕上的绘图等。
7. 异常丢失
try {
lm.f();
} finally {
lm.dispose();
}
如果lm.f()和lm.dispose()都会抛出错误的话,f()中抛出的错误会被彻底丢失。C++中就不存在这个问题。
所以对于会抛出错误的方法,最好将他们放入每一个try-catch块中。