`
Riddick
  • 浏览: 632884 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java.lang.throwable源代码

    博客分类:
  • J2SE
阅读更多
package java.lang;
import java.io.*;
/**
* 
* Throwable是所有Error和Exceptiong的父类
* 注意它有四个构造函数:
* Throwable()
* Throwable(String message)
* Throwable(Throwable cause)
* Throwable(String message, Throwable cause)
* 
*/
public class Throwable implements Serializable {
      private static final long serialVersionUID = -3042686055658047285L;

      /**
       * Native code saves some indication of the stack backtrace in this slot.
       */
      private transient Object backtrace; 

      /**
       * 描述此异常的信息
       */
      private String detailMessage;

      /**
       * 表示当前异常由那个Throwable引起
        * 如果为null表示此异常不是由其他Throwable引起的
        * 如果此对象与自己相同,表明此异常的起因对象还没有被初始化
       */
      private Throwable cause = this;

      /**
       * 描述异常轨迹的数组
       */
      private StackTraceElement[] stackTrace;

      /**
       * 构造函数,起因对象没有被初始化可以在以后使用initCause进行初始化
        * fillInStackTrace可以用来初始化它的异常轨迹的数组
       */
      public Throwable() {
          fillInStackTrace();
      }

      /**
       * 构造函数
       */
      public Throwable(String message) {
         //填充异常轨迹数组
          fillInStackTrace();
         //初始化异常描述信息
          detailMessage = message;
      }

      /**
       * 构造函数,cause表示起因对象
       */
      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();
      }

      /**
       * 获取起因对象
       */
      public Throwable getCause() {
          return (cause==this ? null : cause);
      }

      /**
       * 初始化起因对象,这个方法只能在未被初始化的情况下调用一次
       */
      public synchronized Throwable initCause(Throwable cause) {
         //如果不是未初始化状态则抛出异常
          if (this.cause != this)
              throw new IllegalStateException("Can't overwrite cause");
        
         //要设置的起因对象与自身相等则抛出异常
          if (cause == this)
              throw new IllegalArgumentException("Self-causation not permitted");
        
         //设置起因对象
          this.cause = cause;
         //返回设置的起因的对象
          return this;
      }

      /**
       * 字符串表示形式
       */
      public String toString() {     
          String s = getClass().getName();        
          String message = getLocalizedMessage();      
          return (message != null) ? (s + ": " + message) : s;
      }

      /**
       * 打印出错误轨迹
       */
      public void printStackTrace() { 
          printStackTrace(System.err);
      }

      /**
       * 打印出错误轨迹
       */
      public void printStackTrace(PrintStream s) {
          synchronized (s) {
            //调用当前对象的toString方法
              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);
          }
      }

      /**
       * 打印起因对象的信息
       * @param s 打印的流
        * @param causedTrace 有此对象引起的异常的异常轨迹 
       */
      private void printStackTraceAsCause(PrintStream s,
                                          StackTraceElement[] causedTrace)
      {
         //获得当前的异常轨迹
          StackTraceElement[] trace = getOurStackTrace();
         //m为当前异常轨迹数组的最后一个元素位置, 
         //n为当前对象引起的异常的异常轨迹数组的最后一个元素
          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");

         //获得此对象的起因对象,并递归打印出信息
          Throwable ourCause = getCause();
          if (ourCause != null)
              ourCause.printStackTraceAsCause(s, trace);
      }

      /**
       * 打印出错误轨迹
       */
      public void printStackTrace(PrintWriter 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);
          }
      }

      /**
       * 打印起因对象的信息
        */
      private void printStackTraceAsCause(PrintWriter 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 synchronized native Throwable fillInStackTrace();

      /**
       * 返回当前的异常轨迹的拷贝
       */
      public StackTraceElement[] getStackTrace() {
          return (StackTraceElement[]) getOurStackTrace().clone();
      }

    
      /**
       * 获取当前的异常轨迹
        */
      private synchronized StackTraceElement[] getOurStackTrace() {
         //如果第一次调用此方法则初始化异常轨迹数组
          if (stackTrace == null) {
            //获得异常轨迹深度
              int depth = getStackTraceDepth();
            //创建新的异常轨迹数组,并填充它
              stackTrace = new StackTraceElement[depth];
            
            for (int i=0; i < depth; i++)
                stackTrace[i] = getStackTraceElement(i);//获取指定位标的异常轨迹
          }
        
          return stackTrace;
      }

      /**
       * 设置异常轨迹
       */
      public void setStackTrace(StackTraceElement[] stackTrace) {
         //拷贝设置参数
          StackTraceElement[] defensiveCopy =
              (StackTraceElement[]) stackTrace.clone();
        
         //如果设置参数有空元素则抛出异常
          for (int i = 0; i < defensiveCopy.length; i++)
              if (defensiveCopy[i] == null)
                  throw new NullPointerException("stackTrace[" + i + "]");

         //设置当前对象的异常轨迹
          this.stackTrace = defensiveCopy;
      }

      /**
       * 异常轨迹的深度,0表示无法获得
       */
      private native int getStackTraceDepth();

      /**
       * 获取指定位标的异常轨迹
       */
      private native StackTraceElement getStackTraceElement(int index);

    
      private synchronized void writeObject(java.io.ObjectOutputStream s)
          throws IOException
      {
          getOurStackTrace();
          s.defaultWriteObject();
      }
}
分享到:
评论

相关推荐

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

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

    在Java中异常分析

    java.lang.Throwable java.lang.Exception java.lang.RuntimeException java.lang.ArithmeticException 当出现异常的运算条件时,抛出此异常。  这个异常的解释是 "数学运算异常 ",比如程序中出现了除以...

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

    解析Java中所有错误和异常的父类java.lang.Throwable共3页.pdf.zip

    stuts2.2_API文档

    java.lang.Throwable (implements java.io.Serializable) java.lang.Exception java.lang.RuntimeException com.opensymphony.xwork2.XWorkException (implements com.opensymphony.xwork2.util.location.Locatable...

    Log4J应用技术.PPT

    log(java.lang.Throwable, java.lang.String )。 问题 由于ServletContext 是一个简单的接口,并且也没有规定怎样实现它声明的方法。 因而 log 方法的具体实现是由供应商处理的。 您需要从服务器的文档中得知...

    BuglyTinkerSample

    Bugly 平台集成 Tinker 热修复 demo

    JAVA微信APP和公众号支付

    里面很全各种银行,支付宝,微信等一些支付代码都有,下载后直接导入项目里面看源码

    axis2请求.Net webservice接口Demo

    axis2请求.Net webservice接口,以天气预报getSupportCity接口为例

    fastjson-bypass-autotype-1.2.68:fastjson使用Throwable和AutoCloseable绕过自动类型1.2.68

    fastjson-bypass-autotype-1.2.68 fastjson因为exceptClass期望类的特性导致可以通过AutoCloseable和Throwable绕过自动类型。复现运行org.chabug.fastjson.DemoApplication ,访问 自动关闭绕过POST /parseObject ...

    Java 高级特性.doc

    import java.lang.Integer.parseInt; public class StaticImport { int x = parseInt("123"); System.out.println(x); } 这样的程序如果不在IDE 工具中输入,是很难看出这个程序代码会出现问题,可它偏偏就出问题...

    JAVAssd3选择题答案全

    Multiple-Choice Quiz 1 aaaba aadda 1.Which method must exist in every Java application?... (a) java.lang.Throwable (b) java.lang.Error (c) java.io.IOException (d) java.lang.RuntimeException

    替换两个文件解决Tomcat6项目移植到JBoss5.1下的Logging异常

    除了加入jboss-web.xml,删除xerces-2.6.2.jar和xml-apis.jar之外, &lt;!... ...Ljava.lang.Throwable) 原因是旧版本的slf4j-api不包含以上方法,附件解压后覆盖jboss5.1GA/common/lib下的同名文件即可

    java业务层框架开发ibatis(java源码)

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql....

    Java实现远程屏幕监视

    catch (Throwable e) { e.printStackTrace(); } } } public static void main(String[] args) throws IOException { Server s = new Server(); s.listen(); } } package ...

    java licence生成例子

    (java.lang.Exception e) { System.out.println("生成密钥对失败"); e.printStackTrace(); } } public byte[] getPriKey() { return priKey; } public byte[] getPubKey() { return pubKey; } } ...

    Java面试复习——异常处理

    Java中所有的异常都有一个祖先java.lang.Throwable。Throwable有两个重要子类Error和Exception。 Error表示程序无法处理的错误,是运行时较为严重的问题。大多数错误于代码编写者的执行无关,而是运行JVM时出现的...

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

    java 代码 1. package org.springframework.aop; 2. 3. public interface MethodBeforeAdvice extends BeforeAdvice { 4. void before(Method method, Object[] args, Object target) throws Throwable; 5. } ...

    c3p0工具包(jdbc)

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet....

    Jboss启动报Failed to parse WEB-INFweb.xml; - nested throwable错误

    Jboss启动报Failed to parse WEB-INFweb.xml; - nested throwable错误

    反射机制用Java描述下载资料

    import java.lang.reflect.Array; public class ArrayTest { public static void main(String[] args){ try{ //创建一个元素类型为String,长度为10的数组 Object arr=Array.newInstance(String.class,10)...

Global site tag (gtag.js) - Google Analytics