【在一次CSDN论坛中的讨论
时,看到了ZhangXT
的一篇文章:finally是肯定会执行的!
本文是为其做的注。】
与大多数高级语言一样,Java通过return语句实现函数的带值返回功能。如:
public static String test(){
String str = "Hello world";
return str;
}
与C/C++的处理方式不同,Java在编写代码时,不允许return语句之后还是其它语句存在。如:
public static String test(){
String str = "Hello world";
return str;
str = "Hello world!"; // 编译错误。
}
但是这种语法规则又不是绝对的。如:
public static String test(){
String str = "try";
try {
return str;
}finally {
str = "finally";
}
}
此例编译可以通过,并且函数的返回值为字符串“try”。我们知道finally子句在try子句之后执行,上例从表面上看,“return
str;”语句在“str = "finally";”语句之前被执行。
如果Java语法不允许return语句之后存在其它语句,那么为什么上例在编译时能通过?
如果因为某种原因上例编译通过并能够运行,那么为什么这个函数会返回字符串“try”而不是“finally”呢?
finally子句总是被执行
有人会说,如果try子句中存在return语句的话,finally子句不会被调用。这种论断是错误的。如下例:
class Test {
public static void main(String[] args) throws Exception {
System.out.println(test());
}
public static String test() {
String str = "try";
try {
return str;
} finally {
System.out.println("finally called");
}
}
}
上例的调用结果如下:
finally called
try
其结果可以证明,无论try子句是否存在return语句,finally子句总是被调用。
return操作总是在最后执行
再看一下上文提到的函数:
public static String test(){
String str = "try";
try {
return str;
}finally {
str = "finally";
}
}
问题的实质在于
如果在try子句中存在return语句,JVM做了两件事:
1. 记住最后一个return语句所处代码位置上需要返回的变量值;
2. 将这个值放在函数调用过程的最后返回。
也就是说,上例中“return
str;”一句,函数调用过程中会记录下此时str变量的值,这个值就是函数需要返回的值;当函数调用结束后,即finally子句结束后,将刚才记录下
来的值返回。
因此上述代码的返回值是“try”而不是“finally”。 其本质上可以用下面的代码表示:
public static String test(){
String tmp; // 声明一个“用于返回数据的变量”
String str = "try";
try {
tmp = str; // 将需要返回的值赋值给该变量
}finally {
str = "finally";
}
return tmp; // 将“用于返回数据的变量”的值返回
}
总是最后一个return语句在起作用
如果在try子句与finally子句中都有return语句,哪一个起作用呢?最后一个。如代码:
public static String test(){
String str = "try";
try {
return str;
}finally {
str = "finally";
return str;
}
}
上例函数的返回值为“finally”,因为是最后一个return语句在起作用。
其本质上可以用下面的代码表示:
public static String test(){
String tmp; // 声明一个“用于返回数据的变量”
String str = "try";
try {
tmp = str; // 将需要返回的值赋值给该变量
}finally {
str = "finally";
tmp = str; // 将需要返回的值赋值给该变量
}
return tmp; // 将“用于返回数据的变量”的值返回
}
return语句返回的是变量的值而不是对象的内容
关于变量的值与对象的内容之间的关系
,这里不再多说。需要记住的是,return语句返回的是变量的值,与对象的内容无关。如:
public static StringBuilder test(){
StringBuilder build = new StringBuilder("try ");
try{
return build;
} finally {
build.append("finally");
build = new StringBuilder("new value");
}
}
上例中“return
build;”一句记录下此时build变量的值(引用对象的地址值),之后第7句对build变量的重新赋值已经无法影响函数的返回值,但是第6句修改
了build变量所指对象的内容。因此上例的返回值,其所指对象的内容为“try finally”而不是另一个内容为“new value”的新对象。
上述代码本质上可以用下面的代码表示:
public static StringBuilder test(){
StringBuilder tmp; // 声明一个“用于返回数据的变量”
StringBuilder build = new StringBuilder("try ");
try{
tmp = build; // 将需要返回的值赋值给该变量
} finally {
build.append("finally");
build = new StringBuilder("new value");
}
return tmp; // 将“用于返回数据的变量”的值返回
}
© 丑小鸭技术专栏
| 查看原文
分享到:
相关推荐
finally语句块与return的执行关系
Condition 3: try中有异常,try-catch-finally里都没有return ,finally 之后有个returntry中有异常以后,根据
本文主要给大家介绍了在Python中return和finally共同存在的坑,以及填坑经验,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 初识 return 相信每一个用过Python函数的童鞋, 肯定会用过return...
Java语言finally语句详解,finally到底是在return之前还是之后执行.zip
在Java中当try、finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家众说纷纭,有的说会执行,有的说不会执行,到底哪种说法正确,下面我们来详细讨论下
Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。
在Java的异常机制中,如果finally中含有return语句,则try和catch中的return语句将会被JVM忽视
NULL 博文链接:https://seaizon.iteye.com/blog/2066983
Shouldn t crash on regexps with many nested parentheses.
The production IfStatement : if ( Expression ) Statement else Statement is evaluated as follows:.
主要介绍了Java中finally和return的关系实例解析,总结了二者的关系,然后分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
try、catch、finally、return 执行顺序超详细讲解,包看包会。
第一:return语句并不是函数的终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回) 第二:finally里面不建议放return语句,根据需要,return语句...
try-catch-finally执行顺序验证(左边是....(2)如果finally中无return则执行return var,finally块中的操作不会影响var的值(如果var的值是对象的内存地址,则finally块的操作可以改变该对象的属性值)。 验证 1.基本类型
主要介绍了Java异常处理中同时有finally和return语句的执行问题,首先确定的是一般finally语句都会被执行...然后,需要的朋友可以参考下
下面小编就为大家带来一篇浅谈Java finally语句到底是在return之前还是之后执行(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种情况 ## 三.finally代码块和finalize()方法有什么区别? 无论是否抛出异常,finally代码块...
主要介绍了关于Java中try finally return语句的执行顺序浅析,需要的朋友可以参考下
我们知道return语句用在某一个方法中,一是用于返回函数的执行结果,二是用于返回值为void类型的函数中,仅仅是一个return语句(return ;),此时用于结束方法的执行,也即此return后的语句将不会被执行,当然,这种...