`
zy19982004
  • 浏览: 655429 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:250166
社区版块
存档分类
最新评论

Java异常学习一:Throwable源码

 
阅读更多

一.java异常类结构

常用的CheckedException

常用的RuntimeException

 

二.Throwable类源码

  1.  StackTraceElement。一个final类,代表栈轨迹中的元素,一个异常可能有多个元素。
    public final class StackTraceElement implements java.io.Serializable {
        // Normally initialized by VM (public constructor added in 1.5)
        private String declaringClass;//com.jyz.study.jdk.exception.ExceptionTest
        private String methodName;//equals
        private String fileName;//ExceptionTest.java
        private int    lineNumber;//17
    
        //可以看到 native方法lineNumber=-2
        public boolean isNativeMethod() {
            return lineNumber == -2;
        }
    
        //com.jyz.study.jdk.exception.ExceptionTest.equals(ExceptionTest.java:17)
        public String toString() {
            return getClassName() + "." + methodName +
                (isNativeMethod() ? "(Native Method)" :
                 (fileName != null && lineNumber >= 0 ?
                  "(" + fileName + ":" + lineNumber + ")" :
                  (fileName != null ?  "("+fileName+")" : "(Unknown Source)")));
        }
    
    
    
    }
     
  2. Throwable。java里所有错误和异常的基类。
    public class Throwable implements Serializable {
       //异常详细信息
        private String detailMessage;
        //初始化异常原因case为本身
        private Throwable cause = this;
        //栈轨迹中的元素
        private StackTraceElement[] stackTrace;
        //一般也就四个构造函数
        public Throwable() {
            fillInStackTrace();
        }
    
        public Throwable(String message) {
            fillInStackTrace();
            detailMessage = message;
        }
    
        public Throwable(String message, Throwable cause) {
            fillInStackTrace();
            detailMessage = message;
            this.cause = cause;
        }
    
        public Throwable(Throwable cause) {
            fillInStackTrace();
            detailMessage = (cause==null ? null : cause.toString());
            this.cause = cause;
        }
    
        //自定义异常时  可以重写此方法
        public String getMessage() {
            return detailMessage;
        }
    
        //也可以重写此方法,比喻绑定国际化资源
        public String getLocalizedMessage() {
            return getMessage();
        }
    
        //if cause == null return null
        public Throwable getCause() {
            return (cause==this ? null : cause);
        }
        //构造异常链
       public synchronized Throwable initCause(Throwable cause) {
            if (this.cause != this)//一旦通过初始化或者initCause设置了cause,就不能再次设置了
                throw new IllegalStateException("Can't overwrite cause");
            if (cause == this)//如果 cause 是此 throwable。(throwable 不能是它自己的 cause。)
                throw new IllegalArgumentException("Self-causation not permitted");
            this.cause = cause;
            return this;
        }
    
        
        public void printStackTrace() {
            printStackTrace(System.err);
        }
    
        //先打印thia,再打印方法调用的栈轨迹,最后打印cause
        public void printStackTrace(PrintStream s) {
            synchronized (s) {
                s.println(this);
                StackTraceElement[] trace = getOurStackTrace();
                for (int i=0; i < trace.length; i++)
                    s.println("\tat " + trace[i]);
    
                Throwable ourCause = getCause();
                if (ourCause != null)
                    ourCause.printStackTraceAsCause(s, trace);
            }
        }
    
        //迭代打印cause
        private void printStackTraceAsCause(PrintStream s,
                                            StackTraceElement[] causedTrace)
        {
            // assert Thread.holdsLock(s);
    
            // Compute number of frames in common between this and caused
            StackTraceElement[] trace = getOurStackTrace();
            int m = trace.length-1, n = causedTrace.length-1;
            while (m >= 0 && n >=0 && trace[m].equals(causedTrace[n])) {
                m--; n--;
            }
            int framesInCommon = trace.length - 1 - m;
    
            s.println("Caused by: " + this);
            for (int i=0; i <= m; i++)
                s.println("\tat " + trace[i]);
            if (framesInCommon != 0)
                s.println("\t... " + framesInCommon + " more");
    
            // Recurse if we have a cause
            Throwable ourCause = getCause();
            if (ourCause != null)
                ourCause.printStackTraceAsCause(s, trace);
        }
        public void printStackTrace(PrintWriter s) {
                //...同上
        }
        private void printStackTraceAsCause(PrintWriter s,
                                            StackTraceElement[] causedTrace)
        {
            //...同上}
    
        public StackTraceElement[] getStackTrace() {
            return (StackTraceElement[]) getOurStackTrace().clone();
        }
    
         //native方法获取方法调用的栈轨迹  一个Throwable的stackTrace是固定的
        private synchronized StackTraceElement[] getOurStackTrace() {
            // Initialize stack trace if this is the first call to this method
            if (stackTrace == null) {
                int depth = getStackTraceDepth();
                stackTrace = new StackTraceElement[depth];
                for (int i=0; i < depth; i++)
                    stackTrace[i] = getStackTraceElement(i);
            }
            return stackTrace;
        }
    
        native int getStackTraceDepth();
    
        native StackTraceElement getStackTraceElement(int index);
    
    
        }
    }
    
1
0
分享到:
评论

相关推荐

    解析Java中所有错误和异常的父类java.lang.Throwable

    主要介绍了Java中所有错误和异常的父类java.lang.Throwable,文章中简单地分析了其源码,说明在代码注释中,需要的朋友可以参考下

    Java自定义异常案例--ExceptionManager(java源码)

    * constructor &lt;code&gt;ExceptionManager(String msg,Throwable throwable)&lt;/code&gt;. * * @param msg The message will pass the specified constructor * @param throwable The cause will pass the ...

    2024年java面试题-java异常方面的面试题

    核心内容在于介绍java面试方面经常提到的关于异常处理方面的面试题,其中包括异常的基本结构、throwable、exception、try-catch-finally、以及其中对应的八股文和部分源码,在应付面试以及平常工作coding期间还是有...

    java8源码-spring-boot-with-kotlin:spring-bootkotlin示例

    源码 spring-boot-with-kotlin spring-boot kotlin example 技术介绍 &gt; * 使用spring boot2.0.0M5 ,Spring5.0.0 通用 Mybatis PageHeper &gt; * 使用 java8 + Kotlin 基本功能 &gt; * 1 集成mybatis 通用mapper 和 分页 &gt;...

    java7源码-demo515:异常处理

    111-Java-异常处理机制.md 异常简介 异常的定义 运行期间出现的错误,而不是编译时的语法错误 例如, 打开一个不存在的文件 网络连接中断 操作数组越界等 异常的定义 示 例 数组越界异常 public class excption_...

    java 面试题 总结

    Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...

    超级有影响力霸气的Java面试题大全文档

     Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...

    xLog:Android记录器,美观,功能强大且灵活,可记录到文件及各处(仍在更新中)

    用throwable记录一条消息,通常在引发异常时使用。 XLog . e(message, throwable); 还支持格式字符串,因此您不必通过+附加这么多的字符串和变量。 XLog . d( " Hello %s, I am %d " , " Elvis " , 20 ); 未...

    百度地图毕业设计源码-Crash:这是一个研究androidcrash的源码项目

    java编译器不会检查它,一般由程序逻辑错误引起的,程序应该从逻辑角度尽可能的避免这类异常 (如 空指针) 非运行异常: 从程序语法角度上必须处理的异常 不处理则编译不通过(如 IOException) 2、研究

    Guava 16.0 API (CHM格式)

    Throwable类: 简化了异常检查和错误传播。  二. 集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知的部分。  1. Immutable collections(不变的集合): 防御性编程, 不可...

    java线程池概念.txt

    workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择   ArrayBlockingQueue;  LinkedBlockingQueue;  ...

    spring aop 实现源代码--xml and annotation(带lib包)

    before方法会在目标对象的指定方法执行之前被执行,在before方法种,你可以取得指定方法的Method实例、参数列表和目标对象,在before方法执行完后,目标对象上的方法将会执行,除非在before方法种抛出异常。...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    框架中的MongoDB项目是我用来作为文件服务器的一个实现,很简单实现了上传下载删除和预览的几个接口,大家可以看源码,有朋友问到秒传怎么做 这里只是简单说一个关键词(MD5)原理自行理解吧 Redis延迟消费的项目是...

Global site tag (gtag.js) - Google Analytics