Throwable
public class Throwable implements Serializable
之前一直以为叫xxable的都是接口, 但是Throwable是一个类.
懒得自己画图, 然后从网上找了个图表示这些类之间的关系:
三者之间的关系
请参考其他文章吧. 简单来说, 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
等方法.