一.java异常类结构
常用的CheckedException
常用的RuntimeException
二.Throwable类源码
- 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)"))); } }
- 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); } }
相关推荐
主要介绍了Java中所有错误和异常的父类java.lang.Throwable,文章中简单地分析了其源码,说明在代码注释中,需要的朋友可以参考下
* constructor <code>ExceptionManager(String msg,Throwable throwable)</code>. * * @param msg The message will pass the specified constructor * @param throwable The cause will pass the ...
核心内容在于介绍java面试方面经常提到的关于异常处理方面的面试题,其中包括异常的基本结构、throwable、exception、try-catch-finally、以及其中对应的八股文和部分源码,在应付面试以及平常工作coding期间还是有...
源码 spring-boot-with-kotlin spring-boot kotlin example 技术介绍 > * 使用spring boot2.0.0M5 ,Spring5.0.0 通用 Mybatis PageHeper > * 使用 java8 + Kotlin 基本功能 > * 1 集成mybatis 通用mapper 和 分页 >...
111-Java-异常处理机制.md 异常简介 异常的定义 运行期间出现的错误,而不是编译时的语法错误 例如, 打开一个不存在的文件 网络连接中断 操作数组越界等 异常的定义 示 例 数组越界异常 public class excption_...
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,...
用throwable记录一条消息,通常在引发异常时使用。 XLog . e(message, throwable); 还支持格式字符串,因此您不必通过+附加这么多的字符串和变量。 XLog . d( " Hello %s, I am %d " , " Elvis " , 20 ); 未...
java编译器不会检查它,一般由程序逻辑错误引起的,程序应该从逻辑角度尽可能的避免这类异常 (如 空指针) 非运行异常: 从程序语法角度上必须处理的异常 不处理则编译不通过(如 IOException) 2、研究
Throwable类: 简化了异常检查和错误传播。 二. 集合类:集合类库是 Guava 对 JDK 集合类的扩展, 这是 Guava 项目最完善和为人所知的部分。 1. Immutable collections(不变的集合): 防御性编程, 不可...
workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择 ArrayBlockingQueue; LinkedBlockingQueue; ...
before方法会在目标对象的指定方法执行之前被执行,在before方法种,你可以取得指定方法的Method实例、参数列表和目标对象,在before方法执行完后,目标对象上的方法将会执行,除非在before方法种抛出异常。...
框架中的MongoDB项目是我用来作为文件服务器的一个实现,很简单实现了上传下载删除和预览的几个接口,大家可以看源码,有朋友问到秒传怎么做 这里只是简单说一个关键词(MD5)原理自行理解吧 Redis延迟消费的项目是...