JAVA中try-catch异常逃逸
有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么exception将被添加到“return栈顶”并执行finally。
1) 如果catch中,再次抛出exception,那么原try中的exception是否还能抛出呢?
2) 如果catch中,抛出异常,finally是否继续执行?
3) 如果finally抛出异常,那么catch中抛出的异常,还能被外部捕获到吗?
4) 如果catch中,再次抛出异常,那么在finally中使用“return”,外部还能捕获异常吗?
中断方法调用的手段有“异常中断”和“return返回”,那么我们可以简单的认为throw异常也是导致方法调用终止的信号,它和return的作用是一样的。
答案1),其实这么说可能不妥,既然catch了,原异常就没有意义了。但是如果没有catch代码块,try中的异常仍会被抛出。
答案2),finaly无论如何,总会执行,即使在try-catch中使用了“return”;但是,如果在catch和finaly中,都使用了“return”,那么最终是哪个return值时有意义的?
- public static int test2() {
- try{
- System.out.println("try");
- throw new RuntimeException("try");
- } catch (Exception e) {
- System.out.println("catch");
- return 1;
- } finally {
- System.out.println("finally");
- return 2;
- }
- }
public static int test2() {
try{
System.out.println("try");
throw new RuntimeException("try");
} catch (Exception e) {
System.out.println("catch");
return 1;
} finally {
System.out.println("finally");
return 2;
}
}
如上述代码,那么最终返回的是“1”还是“2”?答案是2。
答案3),因为java中“exception栈”只能保存最后一条,因此最后抛出的异常将会替换原来的异常,因此如果finally中抛出异常,那么catch中的再次抛出的异常将被“擦除”(逃逸)。
答案4),“return”和“exception”都被认为是“方法中断”操作,最后发生者将会生效;当catch中再次抛出异常,原目的是将此异常抛给调用者,结果在finally中使用return(我们认为此处使用return是不当的),那么异常将会被擦除,“return”正常返回。为了避免这种问题,我们可以这么做:
- Throwable ex = null;
- try{
- System.out.println("try");
- throw new RuntimeException("try");
- } catch (Exception e) {
- ex = e;
- } finally {
- System.out.println("finally");
- if(ex != null) {
- throw new RuntimeException(ex);
- }
- return 2;
- }
Throwable ex = null;
try{
System.out.println("try");
throw new RuntimeException("try");
} catch (Exception e) {
ex = e;
} finally {
System.out.println("finally");
if(ex != null) {
throw new RuntimeException(ex);
}
return 2;
}
JAVA中try-catch异常逃逸的更多相关文章
- Java中的受检异常
Java中的受检异常 Java提供了三种异常类型,受检异常(checked exception).运行时异常(runtime exception).错误(error).那么这受检异常在实际开发中又有什 ...
- java中try{}catch{}和finally{}的执行顺序问题
今天我给大家讲解一下java的的错误和异常处理机制以及相关异常的执行顺序问题.如有不足的地方,欢迎批评指正~ 1.首相简单介绍一下java中的错误(Error)和异常(Exception) 错误和异 ...
- Java中try,catch,finally的用法
Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下. Java异常处理的组合方式: 1.try+catch 运行流程:运行到try ...
- Java中常见的异常类型
一. Java中常见的异常类 异常类 说明 ClassCastException 类型准换异常 ClassNotFoundException 未找到相应类异常 ArithmeticException ...
- 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)
Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...
- Java中的ExceptionInInitializerError异常及解决方法
当在静态初始化块中出现了异常的时候,JVM会抛出 java.lang.ExceptionInInitializerError异常.如果你了解Java中的静态变量,你会知道它们是在类加载的时候进行初始化 ...
- java中 try catch finally和return联合使用时,代码执行顺序的小细节
代码1测试 public static void main(String[] args) { aa(); } static int aa() { try { int a=4/0; } catch (E ...
- java中接口的简单运用&java中的一些异常(运用myeclipse)
package test;//创建一个名为test的包 public class A4paper implements Paper { public String getSize(){ return& ...
- Java中try catch finally语句中含return语句的执行情况总结-编程陷阱
前言:有java编程基础的人对java的异常处理机制都会有一定了解,而且可能感觉使用起来也比较简单,但如果在try catch finally语句块中遇到return语句,开发者可能就会遇到一些逻辑问 ...
- 深度分析:Java中如何如理异常,一篇帮你搞定!
异常的背景 初识异常 我们曾经的代码中已经接触了一些 "异常" 了. 例如: 除以 0 System.out.println(10 / 0); // 执行结果 Exception ...
随机推荐
- Codeforces 129A-Cookies(暴力)
A. Cookies time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- Codeforces #258 Div.2 E Devu and Flowers
大致题意: 从n个盒子里面取出s多花.每一个盒子里面的花都同样,而且每一个盒子里面花的多数为f[i],求取法总数. 解题思路: 我们知道假设n个盒子里面花的数量无限,那么取法总数为:C(s+n-1, ...
- Dos图像复制成序列
rem 输入1.png,在当前文件下复制.0000.png--0002.png rem 注:way2是不等待0001.png运行完就開始运行下一个了. rem 假设要等待上一个运行完后,再往下顺弃运行 ...
- HDU 2102 A计划 (三维的迷宫BFS)
题目链接:pid=2102">传送门 题意: 三维的一个迷宫,起点在第一层的S(0,0,0)处,问是否能在规定的时间内走到第二层的P 处.'*'代表不能走,'.'代表能够走,'#'代表 ...
- android图像处理系列之五--给图片添加边框(中)
前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...
- beego的orm ,用的数据库sqlite3
测试 beego的orm ,用的数据库sqlite3 1 package main import ( "fmt" "github.com/astaxie/beego/or ...
- centos7 Another app is currently holding the yum lock; waiting for it to exit...
解决方法:rm -rf /var/run/yum.pid 来强行解除锁定,然后你的yum就可以运行了
- javascript进阶教程第二章对象案例实战
javascript进阶教程第二章对象案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过案例练习补充几个之前没有见到或者虽然讲过单是讲的不仔细的知识点. 二.具体实例 温馨提示 面向对象的知 ...
- amazeui学习笔记一(开始使用5)--藏品collections
amazeui学习笔记一(开始使用5)--藏品collections 一.总结 1.藏品collections:一些 Amaze UI 中没有的功能.amazeui认为好的解决方案.像图表绘制里面的百 ...
- HDU1969 Pie(二分搜索)
题目大意是要办生日Party,有n个馅饼,有f个朋友.接下来是n个馅饼的半径.然后是分馅饼了, 注意咯自己也要,大家都要一样大,形状没什么要求,但都要是一整块的那种,也就是说不能从两个饼中 各割一小块 ...