- 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();
- }
- }
- 浏览: 116072 次
- 性别:
- 来自: 合肥
相关推荐
5. **异常处理**:Java的异常处理机制在`java.lang.Throwable`及其子类中体现,通过源码可以理解异常的抛出、捕获和处理流程。 6. **反射机制**:`java.lang.reflect`包提供了运行时检查和操作类、接口、字段和方法...
再次,JAVA源码中的异常处理和错误报告机制,如`java.lang.Throwable`及其子类,帮助我们更好地理解和处理程序运行时可能出现的问题。同时,JAVA的反射API (`java.lang.reflect`) 和注解处理器(`javax.annotation....
《疯狂Java讲义》是Java编程领域的一本经典教材,其源码分为多个部分,这里主要探讨的是第六部分,涵盖了第11至13章的内容。这三章涉及了Java高级特性和面向对象编程的深入理解,对于进阶Java开发者来说至关重要。...
- **异常处理**:`java.lang.Throwable`及其子类,如Exception和Error,理解异常的层次结构和处理机制。 - **多线程**:`java.lang.Thread`和`java.util.concurrent`包,探究并发编程的实现,如锁、同步、线程池等...
### Java Spring AOP源码分析 #### 概述 在探讨Spring AOP源码之前,我们首先需要了解Spring AOP的基本概念以及它的工作原理。面向切面编程(Aspect-Oriented Programming, AOP)是一种编程范式,它通过将横切关注...
4. **异常处理**:Java.lang.Throwable及其子类如Exception和Error定义了异常处理机制。源码分析有助于理解异常的层次结构和如何有效地抛出、捕获和处理异常。 5. **反射API**:Java.lang.reflect允许程序在运行时...
- Java的异常处理机制基于`java.lang.Throwable`类及其子类,如Exception和Error。理解何时抛出异常,如何捕获和处理异常,是编写健壮代码的基础。 7. **垃圾收集(Garbage Collection)**: - 虽然JVM的垃圾收集...
Java 深入源码级的面试题涵盖了多个核心领域,包括垃圾回收机制、字符编码、代理模式以及异常处理。让我们逐一深入探讨这些知识点。 首先,垃圾回收机制是 Java 语言的一大特性,它负责自动释放不再使用的内存。当...
标题 "class_java_源码.rar.rar" 暗示了这是一个包含Java源代码的压缩文件,可能是某个Java项目或库的源代码集合。虽然没有具体的描述,我们可以根据Java类文件(.class)的一般用途来推测其中可能包含的知识点。 1...
"java源码 app崩溃后自动重启 示例源码"这个主题涉及到的是如何处理应用崩溃,并在崩溃后自动恢复运行,以提供良好的用户体验。这个场景通常通过实现自定义的错误处理机制来完成,以下是一些关键知识点: 1. **全局...
异常类是Java.lang.Throwable的子类,常见的有IOException、NullPointerException、ArrayIndexOutOfBoundsException等。 7. **集合框架**:Java集合框架包括List、Set、Queue等接口以及ArrayList、HashSet、...
3. **异常处理**:`java.lang.Throwable`是所有异常和错误的基类,包括`Exception`和`Error`。异常处理通过`try-catch-finally`块来捕获和处理运行时可能出现的问题,确保程序的健壮性。 4. **输入/输出流**:`java...
4. **异常处理**:Java的异常处理机制基于`try-catch-finally`语句块,`java.lang.Throwable`是所有异常类的父类,包括`Exception`和`Error`。理解和掌握异常处理对于编写健壮的代码至关重要。 5. **I/O与NIO**:`...
7. **异常处理**: `java.lang.Throwable`及其子类,如`Exception`和`Error`,构成了Java的异常处理系统。源码分析可以解释异常的构造、传播和捕获过程。 8. **工具类**: `java.util`和`java.text`等包中的工具类,...
书中可能包含一些关于异常链、try-catch-finally语句块和throwable类型的puzzlers,通过分析这些源码,我们可以学习如何优雅地处理异常,避免程序的脆弱性。 再者,集合框架是Java编程的基石,但其内部机制如果不...
3. **异常处理**:`java.lang.Throwable`是所有异常和错误的基类,包括`Exception`和`Error`。`Exception`用于表示程序运行时出现的非致命问题,而`Error`通常表示严重的问题,如系统资源耗尽。 4. **多线程**:`...
6. **异常处理**:`java.lang.Throwable`及其子类,如`Exception`和`Error`,定义了Java的异常模型。源码可以帮助理解异常的传播和处理机制。 7. **日期与时间API**:在JDK 1.8中,`java.time`包提供了新的日期和...
答:Throwable 是 Java 中的异常类的父类。 Java 多线程 17. Java 中的多线程是什么? 答:Java 中的多线程是指同一个程序中多个线程的并发执行。 18. Java 中的线程的生命周期是什么? 答:Java 中的线程的生命...
本压缩包文件包含了关于Java WebSocket编程的相关知识和源码示例。 首先,让我们了解一下WebSocket的基本概念。WebSocket协议是基于TCP的,它通过在HTTP的握手过程中升级连接来建立持久的全双工通道。这意味着...