美文网首页
Java8 API学习15 - java.lang.Throwa

Java8 API学习15 - java.lang.Throwa

作者: raBBtt | 来源:发表于2018-06-29 15:51 被阅读0次

    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等方法.

    相关文章

      网友评论

          本文标题:Java8 API学习15 - java.lang.Throwa

          本文链接:https://www.haomeiwen.com/subject/ckabyftx.html