- 浏览: 52839 次
文章分类
最新评论
之前在博客中有一篇文章讨论过异常中return值的情况,有兴趣可以参见http://gaofulai1988.iteye.com/admin/blogs/2259371,当时的例子比较简单,今天来了特殊点的例子。
在上例子之前,还是回顾以下之前的几个要点:
1. throw 后面的代码是不会执行的。
2. 不管是否有异常,都会执行finally。
3. 不管有多少个return, 只会执行finally里的return。
此时的答案是多少呢?
进入了finally里了,但是不是2,是1?! 不可思议!看来只能找Oracle来帮我们解答了。
If the try clause executes a return, the compiled code does the following:
Saves the return value (if any) in a local variable.
Executes a jsr to the code for the finally clause.
Upon return from the finally clause, returns the value saved in the local variable.
The compiler sets up a special exception handler, which catches any exception thrown by the try clause. If an exception is thrown in the try clause, this exception handler does the following:
Saves the exception in a local variable.
Executes a jsr to the finally clause.
Upon return from the finally clause, rethrows the exception.
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5
现在明白了吧,进入到finally里后的操作其实没有什么用,因为之前的变量已经被保存起来了。
在上例子之前,还是回顾以下之前的几个要点:
1. throw 后面的代码是不会执行的。
2. 不管是否有异常,都会执行finally。
3. 不管有多少个return, 只会执行finally里的return。
public static int doexception(){ int x=0; try{ throw new Exception("aaa"); }catch(Exception e){ System.out.println("catch exception"); return ++x; }finally{ System.out.println("finally ...."); ++x; } } public static void main(String args[]){ System.out.println("return value:"+doexception()); }
此时的答案是多少呢?
catch exception finally .... return value:1
进入了finally里了,但是不是2,是1?! 不可思议!看来只能找Oracle来帮我们解答了。
引用
If the try clause executes a return, the compiled code does the following:
Saves the return value (if any) in a local variable.
Executes a jsr to the code for the finally clause.
Upon return from the finally clause, returns the value saved in the local variable.
The compiler sets up a special exception handler, which catches any exception thrown by the try clause. If an exception is thrown in the try clause, this exception handler does the following:
Saves the exception in a local variable.
Executes a jsr to the finally clause.
Upon return from the finally clause, rethrows the exception.
现在明白了吧,进入到finally里后的操作其实没有什么用,因为之前的变量已经被保存起来了。
发表评论
-
Java IO 读文件的各种方法总结
2016-01-01 15:00 695IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 731代理模式作为开发人员 ... -
Java Restful
2015-12-19 14:01 438对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2376我们知道request.getInputStream()只能读 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 861今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 8151. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java RSA 加密 解密 签名 验签
2015-12-09 10:01 61441. 加密的作用 1)明文变密文(你不知道密钥是很难解密的) ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 744xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 4331. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 364Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 414JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 417在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 751Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1987背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
C3P0 连接分析
2015-12-01 19:05 890最近在看C3P0的原理,还是将C3P0的源码导入到Ecplis ... -
微信开发的原理
2015-11-30 10:10 1315微信在现在的生活中,扮演着举足轻重的角色,现在怎么东西都在微信 ... -
JAVA Timestamp 与Data的转化以及BigDecimal 保留两位小数
2015-11-27 14:47 16961. BigDecimal 保留两位小数 今天在项目中遇到这 ... -
Java JDBC executeBatch 批量操作
2015-11-27 08:05 1627对JDBC 的 CRUD操作,我相信对于每个开发人员来讲,是十 ... -
Java WeakHashMap 分析
2015-11-26 08:17 619昨天在我们的系统中看 ... -
加密与解密
2015-11-18 18:12 479我本身不是学密码出身的,但在工作中经常要使用加密与解密的东东, ...
相关推荐
即使`try`或`catch`块中存在`return`语句,`finally`块的代码也会被执行。这确保了程序的整洁和资源的有效管理。 在Java中,`try-catch-finally`结构可以单独使用,也可以嵌套使用。嵌套的`try-catch-finally`允许...
即使在`try`或`catch`块中有return语句,`finally`块的代码也会被执行。 5. **多层嵌套** 你还可以在`try-catch-finally`结构内部嵌套另一个`try-catch-finally`结构,以处理更复杂的情况。这种方式使得异常处理...
try、catch、finally、return 执行顺序是 Java 编程语言中的一种 exception 处理机制,用于处理程序中的异常情况。下面我们来详细讲解 try、catch、finally、return 执行顺序的规则和特点。 首先,我们需要了解 try...
Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据
即使在`try`或`catch`块中有`return`语句,`finally`块中的代码也会被执行: ```java try { // 代码 } catch (ExceptionType1 e1) { // 处理 } catch (ExceptionType2 e2) { // 处理 } finally { // 清理资源,...
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
try-catch-finally语句是Java语言中一种常用的异常处理机制,当程序在执行过程中出现异常时,可以使用try-catch-finally语句来捕获和处理异常。下面将详细介绍try-catch-finally语句的使用方法和注意事项。 一、try...
在 Java 规范中规定,在 try-catch-finally 中,如果 try-finally 或者 catch-finally 中都有 return,则两个 return 语句都执行,并且最终返回到调用者那里的是 finally 中 return 的值;而如果 finally 中没有 ...
当 `return` 在 `try` 或 `catch` 块中出现时,通常意味着函数会提前终止,不再继续执行后续的代码。然而,当 `return` 语句在 `finally` 块中时,情况有所不同。虽然 `finally` 会确保其内的代码被执行,但 `return...
本示例中的"trycatch.zip"文件内容就是展示了如何在Golang中模拟`try...catch`和`try...catch...finally`。 Golang的核心错误处理方式是通过返回错误值。通常,函数会返回一个错误值,如果在执行过程中遇到问题,就...
"Java中try finally return语句的执行顺序浅析" 关于Java中try finally return语句的执行顺序浅析是Java语言中一个重要的知识点,今天我们来探讨一下try finally return语句的执行顺序。 首先,需要了解的是...
第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的后。可行的做法有四: 1、return语句只在函数后出现一次。 2、return语句仅在try和catch里面都出现。 3、...
即使在`try`或`catch`块中有`return`语句,`finally`块的代码也会被执行。 ```csharp finally { // 无论是否发生异常都会执行的代码 } ``` 在示例中,无论`j`的值是否为0,`finally`块的`Console.WriteLine(j....
在Java编程语言中,`try-catch-finally`语句块是异常处理的关键构造,它允许程序员优雅地处理可能出现的异常情况。`return`语句则用于从方法中返回一个值或者结束方法的执行。当这两者结合在一起时,就会出现一些...
3. finally语句可以与return语句结合使用,但是finally语句的返回值将覆盖try/catch中的return语句。 4. 在finally中写return语句会有警告,因为它会阻止函数抛出异常,而改为正常返回。 Java中finally和return的...
在Java、C#、JavaScript等语言中,`try-catch-finally`结构是异常处理的基础。这个结构的执行顺序是固定的,下面我们将深入分析其工作原理。 首先,程序会尝试执行`try`块中的代码。`try`块的作用是包含可能抛出...
Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。
这意味着`finally`块的`return`总是会覆盖`try`或`catch`块中的`return`。 现在让我们深入源码层面来进一步理解这个过程。当解释器遇到`return`语句时,它会创建一个包含返回值的对象,并将其存储在一个内部数据...
try-catch-finally执行顺序验证(左边是.java文件,右边是.class文件) 提示: try、catch块内的return操作编译后会变成把return的值保存到变量var的操作。 总结: try、catch块内的return操作编译后会变成把return的值...
3. **finally中的return**:如果`finally`块中也包含了一个`return`语句,则该`return`语句会覆盖`try`块或`catch`块中的`return`语句。这意味着最终返回给调用者的值将是`finally`块中`return`语句指定的值。 综上...