【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常——分析堆栈跟踪元素+使用异常机制的技巧 的相关知识;


【1】分析堆栈跟踪元素相关

1.1)堆栈跟踪: 它是一个方法调用过程的列表, 它包含了程序执行过程中方法调用的特定位置;
1.2)调用Throwable 类的 printStackTrace 方法访问堆栈跟踪的文本描述信息;

Throwable t = new Throwable();
ByteArrayOutputStream out = new ByteArrayOutputStream();
t.printStackTrace(out);
String descriptoin = out.toString();

1.3)更灵活的方法是使用 getStackTrace 方法,它会得到 StackTraceElement对象的一个数组, 可以在你的程序中分析这个对象数组:

Throwable t = new Throwable();
StackTraceElement[] frames = t.getStackTTrace() ;
for(StackTraceElement frame : frames )analyze frame

1.4)StackTraceElement类:含有能够获得文件名和当前执行的代码行号的方法;同时, 还有能够获得类名和方法名的方法;
1.5)看个荔枝(静态的Thread.getAllStackTrace)方法, 它可以产生所有线程的堆栈跟踪, 下面给出这种方式的具体步骤:

Map<Thread, StackTrace[]> map = Thread.getAllStackTraces();
for(Thread t : map.keySet)
{StackTraceElement[] frames = map.get(i);analyze frames;
}

  • API java.lang.Throwable 1.0
    Throwable(Throwable cause)
    Throwable(String msg, Throwable cause) : 给定的原因构造一个 Throwable 对象;
    Throwable initCause(Throable cause):将这个对象设置为原因。 如果这个对象已经设置为原因, 则抛出异常;返回this 引用;
    Throwable getCause():获得设置为这个对象的原因的异常对象。如果没有设置原因, 则返回 null;
    StackTraceElement[] getStackTrace() : 获得构造这个对象时调用堆栈的跟踪;
    void addSuppressed(Throwable t) : 为这个异常增加一个抑制异常, 这出现在带资源的try 语句中, 其中t 是close方法抛出的一个异常;

  • API lang.Exception
    Exception(Throwable cause)
    Exception(String msg, Throwable cause):用给定的原因构造一个异常对象;

  • API java.lang.RuntimeException
    RuntimeException(Throwable cause)
    RuntimeException(String msg, Throwable cause) : 用给定原因构造一个 RuntimeException 异常;

  • API java.lang.StackTraceELement
    String getFileName(): 返回这个元素运行时对应的源文件名, 如果这个信息不存在, 返回null;
    int getLineNumber(): 返回这个元素运行时对应的源文件行数。如果不存在, 返回-1;
    String getClassName():返回这个元素运行时对应的类的全名;
    String getMethodName():返回这个元素运行时对应的方法名。 构造器名是, 静态初始化器名是 , 这里无法区分同名的重载方法;
    boolean isNativeMethod():如果这个元素运行时在一个本地方法中, 则返回true;
    String toString(): 如果存在的话, 返回一个 包含类名, 方法名, 文件名和行数的格式化字符串;


【2】使用异常机制的技巧

2.1)异常处理不能代替简单的测试:

如以下代码或者是: if(!s.empty()) s.pop();
或者是:
try
{s.pop();
}
catch(EmptyStackException e)
{}
  • 我们发现, 调用 isEmpty()的运行时间为 646ms , 而捕获 EmptyStackException 的运行时间为 21739 ms, 所以,我们可以看出, 与执行简单的测试相比, 捕获异常所花费的时间大大超过了前者,
  • 因此使用异常的规则是:只在异常情况下使用异常机制;

2.2)不要过分地细化异常

  • 很多coder 吧每一条语句都分装在一个独立的 try 语句块中;因此, 有必要将整个任务包装在一个try 语句块中,这样, 当任何一个操作出现问题时, 整个任务都可以取消了;

2.3)利用异常层次结构

  • 2.3.1)不要只抛出RuntimeException异常,应该寻找更加适当的子类或创建自己的异常类;
  • 2.3.2)不要只捕获Throwable 异常, 否则,会使代码更难读和维护;
  • 2.3.3)考虑已检查异常与未检查异常的区别。因为已检查异常本身就很庞大, 不要为逻辑错误抛出这些异常;
  • 2.3.4)将一种异常转换为另一种异常时不要犹豫。例如, 在解析某个文件的一个整数时, 捕获 NumberFormatException 异常, 然后将它转换为 IOException 或 MySubSystemException的子类;

2.4)不要压制异常, 在java中, 往往强烈地倾向于关闭异常

  • 如果编写了一个调用另一个方法的方法, 该方法有可能100年才抛出一个异常, 那么编译器会因为没有将这个异常列在throws 表中产生抱怨。 而没有将这个异常列在其中的原因是 编译器将会对所有调用这个方法的方法进行异常处理的考虑, 因此, 应该将这个异常关闭;
public Image loadImage(String s)
{try{code that threatens to throw checked exceptions}catch(Exception e){}// so there
}
  • 现在, 这段代码就可以通过编译了;

2.5)在检查错误时, 苛刻要比放任好

  • 如, 当栈空时, Stack.pop() 是返回一个 null , 还是抛出一个异常? 我们认为: 在出错的地方抛出一个 EmptyStackException 异常要比在后面抛出一个 NullPointerException 要好;

2.6)不要羞于传递异常

  • 如, FileInputStream 构造器或 readLIne方法, 这些方法就会本能地捕获这些可能产生的异常, 其实, 传递异常要比捕获这些异常更好:
public void readStuff(String filename) throws IOException
{InputStream in = new FileInputStream(filename);......
}
  • 让高层次的方法通知用户发生了错误, 或者放弃不成功的命令更加适宜;

java异常——分析堆栈跟踪元素+使用异常机制的技巧相关推荐

  1. oracle获取堆栈,如何从RAISED异常中获取oracle PL / SQL中原始异常的堆栈跟踪?

    我有一个问题,当我捕获异常时,原始堆栈跟踪丢失,然后提高它. >在proc_a中抛出异常 >抓住例外. >执行回滚. >提出异常. >捕获异常(父块) >打印堆栈跟 ...

  2. c#堆栈跟踪;c#异常原因查找打印;c#打印错误日志

    #region 创建错误日志         /// <summary>         /// 创建错误日志         /// </summary>         p ...

  3. Java 集合中遍历删除元素抛异常的原因,从ArrayList说起

    文章目录 使用for删除遗漏元素的原因: 使用foreach删除报错的原因: 其它集合的删除方法 删除集合元素的工具类 ArrayList删除元素的方式. 使用for循环删除.会遗漏删除的元素 使用f ...

  4. Throwable源码异常分析

    问题: Throwable是所有异常的父类,那么异常到底包含哪些信息呢? 1.Throwable包含哪些成员变量? public class Throwable implements Serializ ...

  5. java堆栈_java线程的堆栈跟踪之jstack篇

    该命令打印java线程的堆栈跟踪,可以得知哪些线程被阻塞或正等待,以便于查找如线程死锁的原因 用法: jstack [ option ] pid jstack [ option ] executabl ...

  6. 如何将堆栈跟踪转换为字符串?

    将Throwable.getStackTrace()的结果转换为描述堆栈跟踪的字符串的最简单方法是什么? #1楼 如果您是针对Android开发的,则更简单的方法是使用此方法: import andr ...

  7. Xdebug中文文档-堆栈跟踪

    文档内容来自xdebug.org/docs,翻译时xdebug版本为2.6.我在官方文档基础上针对中文排版和教程内容的编排做了一些优化,希望中文文档看起来更容易理解. 英文原始文档地址:https:/ ...

  8. 堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪

    堆栈跟踪 堆栈跟踪 我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆. 我希望我没有经历过的那种经历. 在创建Plumbr之前很长一段时间,我正在调试一个应用程序,该应用程序每次在蓝月亮时都 ...

  9. 如何在Node.js中打印堆栈跟踪?

    本文翻译自:How to print a stack trace in Node.js? 有谁知道如何在Node.js中打印堆栈跟踪? #1楼 参考:https://stackoom.com/ques ...

最新文章

  1. tf2运行YOLOv4(tflite)
  2. 数据库连接池为什么要用threadlocal呢?不用会怎样?
  3. 《Java工程师修炼之道》内容概览
  4. dSploitzANTI渗透教程之启动zANTI工具
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板定义
  6. DjangoAdmin站点调整列表页展示
  7. RK3308(5)---编译根文件系统
  8. Dell R720服务器安装Ubuntu 16.04 Server 版步骤
  9. Hadoop和Spark三大核心组件介绍与对比
  10. [渝粤教育] 广东-国家-开放大学 21秋期末考试马克思主义基本原理概论(A)10882k1 (2)
  11. KeyMob:移动聚合广告的潜力无限
  12. seetaface6教程:封装人脸识别,人脸检测,,眼睛检测,状态,特征.....
  13. 如何免费下载知网文献_知网文献下载工具_知网下载器Cnkidownloader
  14. 谈谈我的感受:VS Code和Code Runner
  15. 计算机启动死机,电脑开机突然死机怎么回事?小编教你解决开机死机问题
  16. chrome无法访问商店,打不开网页怎么办,五步轻松解决
  17. latex大括号 多行公式_怎样在word中快速输入复杂的公式(在线识别数学、物理或化学公式)?...
  18. python爬虫中字符串开头b,u,r的含义
  19. iOS越狱过程:越狱工具做了什么事情?( iOS系统结构、常见的二进制文件类型)
  20. CSS基础(8)- 盒模型应用

热门文章

  1. P5395 【模板】第二类斯特林数·行
  2. 牛客题霸 [矩阵乘法] C++题解/答案
  3. 牛客网【每日一题】5月22日 [CQOI2009]中位数图
  4. P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】
  5. AT3950-[AGC022E]Median Replace【贪心,dp】
  6. Loj#114-k大异或和【线性基】
  7. jzoj1161-机器人M号【欧拉函数,dp】
  8. ssl1072-砝码称重【dp练习】
  9. 邓公数据结构C++语言版学习笔记1
  10. 【点分治】Tree(luogu 4178/金牌导航 点分治-1)