Throwable
public class Throwable implements Serializable
之前一直以为叫xxable的都是接口, 但是Throwable是一个类.
懒得自己画图, 然后从网上找了个图表示这些类之间的关系:
exceptions1.jpg
三者之间的关系
请参考其他文章吧. 简单来说, Exception是程序本身可以处理的错误, 比如IO异常, 数据库异常, 除0异常等, Error是无法处理的错误, 可能是虚拟机出错或者机器硬件出错等. 只有继承了Throwable的类才能被catch.
Throwable的构造方法
Throwable()
Throwable(String message)
Throwable(Throwable cause)
Throwable(String message, Throwable cause)
可以看出其他构造方法都是Throwable(String message, Throwable cause)
衍生的.
实际上message
和cause
就是Throwable类中的两个成员变量. message是抛出异常时的自定义信息, 这个还好理解; 但是cause有什么用呢?
我们可能见过以下代码:
try {
//...
} catch (Exception e) {
//打印错误日志等操作
throw new Exception(message, e);
}
由此可以理解这个变量命名为"cause"的原因了. 它代表了此异常产生不是直接来源于程序中出现错误, 而是直接来源于另一个异常.
Throwable的对象方法
- final方法
void addSuppressed(Throwable)
Throwable[] getSuppressed()
addSuppressed
方法的作用是什么呢? 引用网上的一段话(很惭愧, 原始出处没有找到):
在java7中为
Throwable
类增加addSuppressed
方法。当一个异常被抛出的时候,可能有其他异常因为该异常而被抑制住,从而无法正常抛出。这时可以通过addSuppressed
方法把这些被抑制的方法记录下来。被抑制的异常会出现在抛出的异常的堆栈信息中,也可以通过getSuppressed
方法来获取这些异常.
主要还是这一句: "被抑制的异常会出现在抛出的异常的堆栈信息中". 如果没有addSuppressed
, 那么原异常是不会在堆栈信息中显示的.
- 一般的对象方法
/*打印错误堆栈, 默认输出到System.err, 否则输出到传入的参数中
例如: printStackTrace(new PrintStream(System.out))转为在System.out中输出, 为什么感觉
这么麻烦呢, 因为PrintStream和PrintWriter主要用来操作文件(或网络传输)的*/
void printStackTrace()
void printStackTrace(PrintStream)
void printStackTrace(PrintWriter)
String getMessage()
String getLocalizedMessage() //*?
//*好像可以根据错误堆栈向上搜索, 该方法调用了内部的一个native方法.
Throwable fillInStackTrace()
//初始化该对象的cause, 注意cause只能被赋值一次, 包括之前通过构造函数赋值; 否则会抛出异常
Throwable initCause(Throwable cause)
Throwable getCause() //注意: 如果cause==this, 会返回null
/*好像是StackTrace的基本元素, 比如一个打印出很多行的错误信息中每一行对应着一个
StackTraceElement吧*/
StackTraceElement[] getStackTrace()
void setStackTrace(StackTraceElement[])
Error和Exception
如果已经从其他文章中了解了二者的区别, 那这里就没有什么可讲的了; 两个类都以相同的参数形式实现了一致的4个构造函数, 没有添加新的方法.
值得一提的是, 这两个类还提供了一个protected的构造方法, 方便我们在写自己的异常处理类时使用.例如Exception中:
protected Exception(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
其他继承了Exception的错误处理类也基本相同, 只有相似的构造函数, 偶尔有些类会添加新的方法, 通常用来获取异常的其他信息, 比如SQLException
会有getErrorCode
, getSQLState
等方法.
网友评论