当前位置:首页 > Java技术 > java 异常处理

java 异常处理

2022年11月07日 08:43:17Java技术8

try  中抛出异常,但如果finally 中也抛出异常的话,try中的异常信息会被忽略掉。例如


1 。异常信息丢失案例


@Test(expected=ArithmeticException.class)
public void test_1(){
//异常信息丢失案例
try {
Integer.parseInt("hello");
} catch (NumberFormatException e) {
log.info("{excetion:}",e);
throw  e; //这个异常被下面的掩盖了。
}finally{
int a = 12 / 0; //expected=ArithmeticException.class 这里的异常
}
}

上面的测试用例通过,可见抛出的异常不是try中的NumberFormatException,而是finally 中的ArithmeticException。

try中的异常信息被丢弃。


2. 解决方法之一:

@Test(expected=NumberFormatException.class)
public void test_2(){
//异常信息丢失案例:解决方法
try {
Integer.parseInt("hello");
} catch (NumberFormatException e) {
log.info("{excetion:}",e);
throw e; //这个异常被下面的掩盖了。
}finally{
try {
int a = 12 / 0;
} catch (Exception e) {
// 忽略此处异常,上面的主要根源异常就可以跑出去了
}
}
}


测试代码通过,expected=NumberFormatException.class 就是try中抛出的异常,因为try中的异常是根源,finally中的异常就丢弃吧。。


3.。解决方法之二:

@Test(expected=RuntimeException.class)
public void test_3(){
//异常信息丢失案例:解决方法
RuntimeException exception = new RuntimeException("error:");
try {

Integer.parseInt("hello");
} catch (NumberFormatException e) {

exception.addSuppressed(e); //把这个异常堆栈信息保留一下

}finally{
try {
int a = 12 / 0;
} catch (Exception e) {
exception.addSuppressed(e);
log.info("{excetion:}",exception);
throw exception;
}
}
}

利用addSuppressed 方法,把异常堆栈信息保留起来,带出去。

看一下log日志,是不少异常信息都有了:


17:07:43.939 [main] INFO  com.github.jdk7.Excetion1 - {excetion:}
java.lang.RuntimeException: error:
at com.github.jdk7.Excetion1.test_3(Excetion1.java:44) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_11]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_11]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_11]
at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_11]
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) [junit-4.11.jar:na]
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.11.jar:na]
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) [junit-4.11.jar:na]
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) [junit-4.11.jar:na]
at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19) [junit-4.11.jar:na]
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) [junit-4.11.jar:na]
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) [junit-4.11.jar:na]
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) [junit-4.11.jar:na]
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) [junit-4.11.jar:na]
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) [junit-4.11.jar:na]
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) [junit-4.11.jar:na]
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) [junit-4.11.jar:na]
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) [junit-4.11.jar:na]
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) [junit-4.11.jar:na]
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) [.cp/:na]
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) [.cp/:na]
Suppressed: java.lang.NumberFormatException: For input string: "hello"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_11]
at java.lang.Integer.parseInt(Integer.java:580) ~[na:1.8.0_11]
at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_11]
at com.github.jdk7.Excetion1.test_3(Excetion1.java:47) ~[classes/:na]
... 24 common frames omitted
Suppressed: java.lang.ArithmeticException: / by zero
at com.github.jdk7.Excetion1.test_3(Excetion1.java:54) ~[classes/:na]
... 24 common frames omitted


看到了吧。Suppressed: java.lang.NumberFormatException: For input string: "hello" 这行,就是try中的异常。

作者:Dreamer who
来源链接:https://blog.csdn.net/doctor_who2004/article/details/39737185

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/68316.html

分享给朋友:

“java 异常处理” 的相关文章

两年前写的Java基础总结书

两年前写的Java基础总结书

想法衍生 两年前的我,突发奇想,把自己学的Java基础进行规范化的整理,因为自己的文档编辑能力有限,所以写的排版不是很好,参照图书排版的形式,将书籍进行整理,可以供学习Java基础的朋友参考,由于时间有限,可能也会有问题,请指出。下载地址在最后 截图如下:...

冒泡排序的原理,思路,以及算法分析(Java实现)

冒泡排序的原理,思路,以及算法分析(Java实现)

冒泡排序 如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。 1.原理:比较两个相邻的元素,将值大的元素交换到右边 2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。 (1)第一次比较:首先比较第...

在JAVA 中将堆与栈分开的原因

栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么 放、放在哪儿。 注意:在Java中一个线程就会相应有一个线程栈与之对应 栈因为是运行单位,因此里面存储的信息都是跟...

Java实现1到n的倒数的累加和

Java实现1到n的倒数的累加和

从键盘读入一个数,然后进行运算 实现代码: public static void main(String[] args) { Scanner in=new Scanner(System.in); int n ; n=in....

JAVA UUID 生成唯一标识

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want 需求     项目在设计表的时候,要处理并发多...

java泛型通配符详解

java泛型通配符详解

前言 泛型带来的好处 泛型中通配符 常用的 T,E,K,V,? ?无界通配符 上界通配符 < ? extends E> 下界通配符 < ? super E>...

java高级

java高级

  Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。下...

Java集合---面试题

HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中,甚至会要求你实现...

java如何防止反编译

java如何防止反编译

综述(写在前面的废话) Java从诞生以来,其基因就是开放精神,也正因此,其可以得到广泛爱好者的支持和奉献,最终很快发展壮大,以至于有今天之风光!但随着java的应用领域越来越广,特别是一些功能要发布到终端用户手中(如Android开发的app),有时候,公司为了商业技术的保密考...

java中的内存模型

java中的内存模型

概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Java同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型。究竟什么...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。