文档章节

JAVA 篇之异常

开源大法好啊
 开源大法好啊
发布于 2017/07/20 23:18
字数 535
阅读 24
收藏 0

1、结构

最顶层的类是序列化类,作用,异常堆栈信息可以通过网络流传送,Throwable是顶层的异常类(你可以看到所有的子类的构造函数都是调用父类的构造器,最后到达Throwable),Exception作为Throwable和其他异常的桥梁(这样更好的扩展异常类,比如自定义异常)。

2、异常的栈信息是怎么打印出来的

我们接触最多的就是异常可以帮助我们打印堆栈信息,下面通过一个列子说明

try {
    InputStream inputStream = new FileInputStream("D://aa");
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

主要是看printStackTrace()栈的源码

synchronized (s.lock()) {
    // Print our stack trace
    s.println(this);
    StackTraceElement[] trace = getOurStackTrace(); //获取堆栈信息
    for (StackTraceElement traceElement : trace)
        s.println("\tat " + traceElement);

    // Print suppressed exceptions, if any
    for (Throwable se : getSuppressed())
        se.printEnclosedStackTrace(s, trace, SUPPRESSED_CAPTION, "\t", dejaVu);

    // Print cause, if any
    Throwable ourCause = getCause();
    if (ourCause != null)
        ourCause.printEnclosedStackTrace(s, trace, CAUSE_CAPTION, "", dejaVu);
}

getOurStackTrace()源码

if (stackTrace == UNASSIGNED_STACK ||
    (stackTrace == null && backtrace != null) /* Out of protocol state */) {
    int depth = getStackTraceDepth(); //获取栈的深度
    stackTrace = new StackTraceElement[depth];  
    for (int i=0; i < depth; i++)
        stackTrace[i] = getStackTraceElement(i);  //获取栈的信息
} else if (stackTrace == null) {
    return UNASSIGNED_STACK;
}

getStackTraceDepth() 和 getStackTraceElement(i)

native int getStackTraceDepth(); //本地方法
native StackTraceElement getStackTraceElement(int index); //本地方法

上诉方法都是在Throwable,从源码可见,其实栈的信息最后都是通过顶层父类Throwable中的方法打印出来,栈的信息是本地方法获取,最后看下异常信息

java.io.FileNotFoundException: D:\aa (系统找不到指定的文件。) 
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(FileInputStream.java:195)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:93)
    at main.test.Throw.main(Throw.java:30)

如果你仔细看new FileInputStream(String name)构造器的源码的话你会看到执行流程

public FileInputStream(String name) throws FileNotFoundException {
    this(name != null ? new File(name) : null);
}
public FileInputStream(File file) throws FileNotFoundException {
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkRead(name);
    }
    if (name == null) {
        throw new NullPointerException();
    }
    if (file.isInvalid()) {
        throw new FileNotFoundException("Invalid file path");
    }
    fd = new FileDescriptor();
    fd.attach(this);
    path = name;
    open(name); //open
}
private void open(String name) throws FileNotFoundException {
    open0(name);
}
private native void open0(String name) throws FileNotFoundException;

看到没有这个是入栈的操作(知识:每个方法都代码一个栈帧),出栈的顺序和入栈顺序是相反的(所以说栈是先进后出的)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
开源大法好啊
粉丝 3
博文 42
码字总数 17798
作品 0
闵行
私信 提问
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
06/21
0
0
Java程序设计经典300例

《Java程序设计经典300例》共分为3篇。 第1篇 基础篇(第1~5章)本篇主要内容包括:Java语言基础、流程控制、数组、字符串和面向对象编程。通过本篇的学习,读者可以掌握Java开发环境的配置...

请叫我院长
2013/12/03
402
0
Java的Exception和Error面试题10问10答

在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题。Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它成为面试题中的...

lwei
2013/10/10
18.2K
48
在 Java 8 中避免 Null 检查

如何预防 Java 中著名的 NullPointerException 异常?这是每个 Java 初学者迟早会问到的关键问题之一。而且中级和高级程序员也在时时刻刻规避这个错误。其是迄今为止 Java 以及很多其他编程语...

ApacheCN飞龙
2016/02/04
8.1K
24
那些年,关于 Java 的那些事儿

版权声明:Follow your heart and intuition. https://blog.csdn.net/qq_35246620/article/details/78695893 温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,...

维C果糖
2017/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker搞个wordpress

1.先把wordpress的镜像下载下来 docker pull wordpress 2.下载mysql docker pull mysql:lastest 3.启动mysql docker run --name blog -e root -d mysql:5.7 docker run --name some-mysql -e......

无极之岚
4分钟前
0
0
【宇润日常疯测-005】PHP 中的 clone 和 new 性能比较

clone和new本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用clone也可以用new,那么这时候我们选哪个呢? 我编写了两个测试,第一个是声明一个空类,第二个是带构造方...

宇润
4分钟前
0
1
点击按钮弹出类似IOS 底部 dialog

implementation 'com.baoyz.actionsheet:library:1.1.7' 然后设置按钮点击监听,,调用下列代码即可 ActionSheet.createBuilder(this, getSupportFragmentManager()) ......

lanyu96
8分钟前
0
0
专访阿里云专有云马劲,一个理性的理想主义者

“我的故事都是和团队技术相关的,自己还真没有什么引人入胜的故事。”当马劲被问到能不能多分享些个人经历故事时他笑着说,我们就干脆怀着好奇聊了聊他和阿里云专有云一路走来的故事。 马劲...

阿里云官方博客
40分钟前
1
0
java环形缓冲区

import java.util.ArrayList;import java.util.List;/** * * 环形缓冲区<br/> * 一. 写数据:<br/> * 1. push: 当数据已写满时返回false,否则可以正常写入返回true<br/>......

whoisliang
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部