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

【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);......
}
  • 让高层次的方法通知用户发生了错误, 或者放弃不成功的命令更加适宜;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jdk8 npe_JDK 14中更好的NPE消息

jdk8 npe我的2019年3月博客文章“ Java会出现更好的默认NullPointerException消息吗&#xff1f; ”的撰写是为了获得更好的NullPointerException消息的JEP 草案尚未针对特定的JDK版本。 此后&#xff0c;该JEP草案成为JEP 14的 目标 JEP 358&#xff08;“ Helpful NullPointe…

开源相册系统Java_基于JAVA的B/S网络相册管理系统

每天记录学习&#xff0c;每天会有好心情。*^_^*今天和一个朋友共同完成了一个网络相册管理系统项目&#xff0c;我们在开发时选用的框架是SSM(MYECLIPSE)框架。我这个朋友知识有限&#xff0c;只会这个框架&#xff0c;哈哈&#xff0c;都是为了方便他。和往常一样选用简单又便…

java断言——Assertion

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java断言——Assertion 的相关知识&#xff1b; 【1】使用断言 1.1&#xff09;断言机制&#xff1a; 允许在测试期间向代码中插入一些检查语句。 当代码发布时&#xff0c; 这些…

常见的并发模型_两个常见的并发错误

常见的并发模型作为Baeldung的编辑&#xff0c;我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章。 这是一本不错的书&#xff0c;但是假设开发人员具有一定的能力。 我已经看到了几件即时并发失败的事情。 它们很容易添加到代码中&#xff0c;并保证为您提供奇怪的结果…

java 哈希一致算法_一致哈希算法Java实现

一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法。传统的Hash算法当槽位(Slot)增减时&#xff0c;面临所有数据重新部署的问题&#xff0c;而一致哈希算法确可以保证&#xff0c;只需要移动K/n份数据(K为数据总量, n为槽位数量)&#xff0c;且只影响…

java日志——基本日志+高级日志

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——基本日志高级日志 的相关知识&#xff1b; 【1】记录日志 1.1&#xff09;出现的问题和解决方法&#xff1a; 1.1.1&#xff09;出现的问题&#xff1a;在我们调试…

java模式匹配_用Java匹配模式

java模式匹配如果您使用的是Java&#xff0c;那么您很有可能以前已经看过它的模式匹配。 String#matches(String)方法在内部使用Pattern类型&#xff0c;该类型包含更复杂的功能&#xff1a; 通过编译正则表达式来创建Pattern 。 该模式与任何输入字符串匹配&#xff0c;并且可…

java在frame怎么计时_java – 退出jframe时的Swing stop计时器

我有一个特定的任务,我按计划的时间间隔运行.基本上我在JFrame中的Label上显示相机.但是,当我退出JFrame时,应用程序似乎运行.我怎么能阻止它&#xff1f;我已经删除了代码的细节,只是将相关部分留在了public class TaskCLass extends JFrame {JPanel p;JLabel l;Timer timer;p…

java日志——修改日志管理器配置+日志本地化

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java日志——修改日志管理器配置日志本地化 的相关知识&#xff1b; 【1】修改日志管理器配置 1.1&#xff09;可以通过编辑配置文件来修改日志系统的各种属性。 在默认情况下&a…

jpa embedded_JPA @Embeddable和@Embedded

jpa embedded介绍&#xff1a; 作为一个面向对象的开发人员&#xff0c;我们希望避免使用带有大量不相关字段的大型类。 因此&#xff0c;我们可能经常感到有必要使用多个对象来表示JPA实体。 在本快速教程中&#xff0c;我们将学习如何使用JPA或Hibernate中的Embedded和Embed…

jdk内置线程实例_EA问题的JDK14实例

jdk内置线程实例Tagir Valeev最近发布了一条有关即将发布的Java JDK14版本的预览功能的推文&#xff1a; &#xff03;Java14模式匹配将名称隐藏带入了更高的疯狂程度。 在这里&#xff0c;我为FLAG字段添加或删除了final修饰符&#xff0c;该修饰符仅在不可达的if分支中访问。…

intro to Apache Log4j 2

【0】README 0.1&#xff09;本文作为 原文&#xff08;http://logging.apache.org/log4j/2.x/&#xff09;的译文&#xff0c;仅作参考&#xff0c; 旨在了解 Log4j 2 的相关知识 &#xff1b; 0.2&#xff09; Apache Log4j 2 是Log4j的升级版&#xff0c;并对其前任Log4j …

php注册页面模板,选项卡式WordPress登陆注册模板

上次说到不用插件也可以修改WordPress登陆注册界面&#xff0c;不过只是简单的修改了CSS&#xff0c;缺少很多元素&#xff0c;例如header、导航、footer等&#xff0c;为了增加这些元素&#xff0c;我们可以采取另一种方式&#xff0c;将WordPress登陆注册界面做成page模板&am…

内核堆栈 用户堆栈_弹性堆栈介绍

内核堆栈 用户堆栈当您运行对公司至关重要的软件时&#xff0c;您将无法拥有仅用于分析一段时间前发生的事情的日志&#xff0c;让客户端告诉您您的应用程序已损坏&#xff0c;而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。 大多数应用…

php 字符串 中文,php 中文字符串截取乱码

PHP截取字符串如果是英文直接用substr就可以了,但对于中文字符&#xff0c;用substring可能会导致乱码&#xff0c;那么将如何解决呢&#xff1f;1、通过函数mb_substr实现说明&#xff1a;mb_substr($str, $start, $length, $encoding);通过该函数即可&#xff0c;但需要加载p…

java 调试技巧

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java 调试技巧 的相关知识&#xff1b; 【1】调试技巧相关 1.1&#xff09;可以用下面的方法打印或记录任意变量的值&#xff1a; System.out.println("x " x); 或 …

jdk 版本和内部版本对应_JDK 14 Rampdown:内部版本27

jdk 版本和内部版本对应马克 雷因霍尔德&#xff08; Mark Reinhold&#xff09;最近的帖子“ JDK 14现在处于Rampdown第一阶段 ”宣布“我们现在处于Rampdown第一阶段”&#xff0c;并且“整体功能已冻结”。 JDK 14 Early Access Build &#xff03;27&#xff08;2019/12/12…

对一个java源文件进行正确编译,给定如下一个Java源文件Child.java,编译并运行Child.java,以下结果正确的是()...

总成化无本优部问决企题业内法解&#xff0c;给定流配特别题是物送问。而他再告真的不是己这却一诉自&#xff0c;个源文译并运行下某人重病的家得了假如人忽然间&#xff0c;的应对策略有他使用到。结果感是个人自我指一效能对&#xff1a;。哲学的规揭示律一般&#xff0c;管…

异常java.lang.Thread.dumpStack(Unknown Source)

转自&#xff1a; http://www.blogjava.net/landon/archive/2011/02/27/345265.html 昨天在公司写了一段代码&#xff0c;很简单&#xff0c;就是测试Thread的dumpStack方法的使用。 因为Thread的dumpStack方法不是很常用&#xff0c;但它对于如果想看看谁在运行时调用方法还是…

java集合框架——接口图+类图+遗留类图

【0】README 0.1&#xff09;绝对的干货&#xff0c;理清 java集合框架中类和接口的层次关系&#xff1b;