Java8 API学习15 - java.lang.Throwa

2018-06-29  本文已影响0人  raBBtt

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)衍生的.
实际上messagecause就是Throwable类中的两个成员变量. message是抛出异常时的自定义信息, 这个还好理解; 但是cause有什么用呢?
我们可能见过以下代码:

try {
    //...
} catch (Exception e) {
    //打印错误日志等操作
    throw new Exception(message, e);
}

由此可以理解这个变量命名为"cause"的原因了. 它代表了此异常产生不是直接来源于程序中出现错误, 而是直接来源于另一个异常.

Throwable的对象方法

  1. final方法
void addSuppressed(Throwable)
Throwable[] getSuppressed()

addSuppressed方法的作用是什么呢? 引用网上的一段话(很惭愧, 原始出处没有找到):

在java7中为Throwable类增加addSuppressed方法。当一个异常被抛出的时候,可能有其他异常因为该异常而被抑制住,从而无法正常抛出。这时可以通过addSuppressed方法把这些被抑制的方法记录下来。被抑制的异常会出现在抛出的异常的堆栈信息中,也可以通过getSuppressed方法来获取这些异常.

主要还是这一句: "被抑制的异常会出现在抛出的异常的堆栈信息中". 如果没有addSuppressed, 那么原异常是不会在堆栈信息中显示的.

  1. 一般的对象方法
/*打印错误堆栈, 默认输出到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等方法.

上一篇下一篇

猜你喜欢

热点阅读