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

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异常处理的方法和几个例子源码.rar

    这个压缩包“Java异常处理的方法和几个例子源码.rar”包含了一些示例代码,帮助开发者深入理解Java中的异常处理机制。下面我们将详细讨论这些知识点。 首先,Java异常是一种在程序运行时发生的错误,它中断了正常的...

    Java异常框架设计

    这篇博文“Java异常框架设计”可能探讨了如何有效地利用Java的异常处理机制来构建可靠的系统。在这个讨论中,我们将深入理解Java异常的基本概念、异常分类、以及如何通过良好的框架设计提升代码的可读性和可维护性。...

    Java SE 源码 Java SE 源码

    5. **异常处理**:Java的异常处理机制在`java.lang.Throwable`及其子类中体现,通过源码可以理解异常的抛出、捕获和处理流程。 6. **反射机制**:`java.lang.reflect`包提供了运行时检查和操作类、接口、字段和方法...

    Java异常处理体系

    Java异常类层次结构基于`java.lang.Throwable`,它是所有异常和错误的基类。Throwable有两个主要子类:`Exception` 和 `Error`。Exception 用于程序中常见的可恢复错误,而 Error 通常是不可恢复的严重问题,比如...

    Java官方英文版源码

    - **异常处理**:`java.lang.Throwable`及其子类,如Exception和Error,理解异常的层次结构和处理机制。 - **多线程**:`java.lang.Thread`和`java.util.concurrent`包,探究并发编程的实现,如锁、同步、线程池等...

    java 异常相关

    在Java编程语言中,异常处理是一项关键特性,用于在程序执行...以上内容基于提供的标题和描述,介绍了Java异常处理的基本概念、机制和最佳实践。通过学习和理解这些知识点,开发者可以编写出更加健壮和易于维护的代码。

    javajdk源码学习-javaSource:JDK源码学习

    7. **异常处理**:`java.lang.Throwable`及其子类如`Exception`和`Error`,展示了Java异常处理的机制。源码中可以看到如何抛出、捕获和处理异常。 8. **字符串处理**:`java.lang.String`是不可变对象,其源码中有...

    java常用类库源码

    4. **异常处理**:Java.lang.Throwable及其子类如Exception和Error定义了异常处理机制。源码分析有助于理解异常的层次结构和如何有效地抛出、捕获和处理异常。 5. **反射API**:Java.lang.reflect允许程序在运行时...

    imooc_exception_book_java_exception_Book2_租车_源码.zip

    《imooc_exception_book_java_exception_Book2_租车_源码》是针对Java异常处理的一份学习资源,其中包含了租车业务的源代码示例。通过分析这份源码,我们可以深入理解Java异常处理机制以及如何在实际项目中应用这些...

    java异常详细介绍

    Java异常处理是Java编程中非常重要的一个概念,它关乎程序的稳定性和健壮性。在Java中,异常是程序运行时出现的不正常情况,...在实际项目中,结合PPT文档和实例源码学习,将有助于更好地掌握Java异常处理的实践应用。

    疯狂Java讲义源码(第六部分)

    《疯狂Java讲义》是Java编程领域的一本经典教材,其源码分为多个部分,这里主要探讨的是第六部分,涵盖了第11至13章的内容。这三章涉及了Java高级特性和面向对象编程的深入理解,对于进阶Java开发者来说至关重要。...

    java源码:Java线程错误捕获工具 CheckThread.zip

    Java线程错误捕获工具CheckThread是一个用于监控和管理Java应用程序中线程异常的重要工具。在多线程编程中,由于并发执行的特性,错误处理变得复杂,有时异常可能不会立即抛出,而是隐藏在后台线程中,导致程序运行...

    java 异常类处理

    在Java编程语言中,异常处理是一项关键特性,用于在程序执行过程中捕获并处理错误或非正常情况。本文将深入探讨Java中的异常类处理,包括异常的分类、处理机制以及如何有效地利用源码和工具进行调试。 首先,Java中...

    总结java的30个异常及方案

    Java异常处理是编程中至关重要的一个环节,它帮助开发者在程序出错时捕获并处理错误,确保程序的健壮性和稳定性。以下是关于Java异常处理的一些关键知识点,以及针对30个常见Java异常的解决方案: 1. **异常体系**...

    实现Java异常抛出和处理

    Java中的所有异常都是`java.lang.Throwable`类的子类,包括`Error`和`Exception`两大类。`Error`通常表示系统级别的问题,如虚拟机错误,开发者通常无法处理这类错误。而`Exception`是程序运行过程中可能出现的异常...

    Mining_JAVA源码_源码.zip

    再次,JAVA源码中的异常处理和错误报告机制,如`java.lang.Throwable`及其子类,帮助我们更好地理解和处理程序运行时可能出现的问题。同时,JAVA的反射API (`java.lang.reflect`) 和注解处理器(`javax.annotation....

    android捕获全局异常,CrashHandler完整工程源码

    本篇将详细介绍如何在Android中实现全局异常捕获,并提供一个名为"CrashHandler"的完整工程源码。 首先,我们需要了解Android中的异常处理机制。在Java中,每个线程都有一个默认的`UncaughtExceptionHandler`,当...

    Java puzzlers(java 解惑)附源码

    书中可能包含一些关于异常链、try-catch-finally语句块和throwable类型的puzzlers,通过分析这些源码,我们可以学习如何优雅地处理异常,避免程序的脆弱性。 再者,集合框架是Java编程的基石,但其内部机制如果不...

    java源码之jdk源码

    - Java的异常处理机制基于`java.lang.Throwable`类及其子类,如Exception和Error。理解何时抛出异常,如何捕获和处理异常,是编写健壮代码的基础。 7. **垃圾收集(Garbage Collection)**: - 虽然JVM的垃圾收集...

    深入理解Java异常体系Java系列2021.pdf

    Java异常体系是Java编程语言中一个至关重要的组成部分,它提供了优雅的方式来处理程序运行时可能出现的错误情况,确保程序的健壮性和可用性。异常处理机制允许开发者将正常的业务逻辑代码与错误处理代码分离,提高...

Global site tag (gtag.js) - Google Analytics