当finally和return同时出现执行的先后问题
1.try和catch中有return语句,finally里面的代码也会被执行。。
2.应该避免finally中出现return语句:Eclipse会给出警告:"finally block does not complete normally"
return的简要作用?
A:返回一个结果,
B:结束这个方法。
finally的简要作用?
收尾工作:可能产生异常catch,也可能不产生异常try,有些必须要执行的代码--->finally
断开连接,释放资源,删除临时文件。。。。
3.finally中尝试修改变量
验证观察如下的代码:
package finally和return的区别;
import java.util.Arrays;
public class Test {
// 返回值为引用类型的数据类型
public String[] fun1() {
String[] arr = {"1号元素","2号元素","3号元素"};
try {
arr[0] += "--->经过try之后";
return arr;
} catch (Exception e) {
return arr;
} finally {
arr[0] += "--->finally执行后";
}
}
// 返回值为基本数据类型的常量
public int fun2() {
int i = 100;
try {
i++;
return i;
} catch (Exception e) {
return i;
} finally {
i = i + 1;
}
}
// 返回值为字符串常量
public String fun3() {
String str = "我是一个字符串常量";
try {
str += "经过try之后";
return str;
} catch (Exception e) {
return str;
} finally {
str += "经过finally之后";
}
}
public static void main(String[] args) {
Test test = new Test();
System.out.println(Arrays.toString(test.fun1()));
//[1号元素--->经过try之后--->finally执行后, 2号元素, 3号元素]
System.out.println(test.fun2());// 101
System.out.println(test.fun3());// 我是一个字符串常量经过try之后
}
}
总结:
1、当 return的返回值为 引用类型的时候,经过finally之后,返回值的结果会发生改变。
2、当return的返回值为 基本数据类型或者字符串常量的时候,经过finally之后,返回值的结果不会发生改变。
3、其实Return执行的虽然在finally之前,但是return是没有执行结束的,而是在finally执行结束之后,return才会真正的执行结束。
4、至于为什么会产生哪两种结果,而是基本数据类型和字符串常量的地址,当值发生改变的时候,引用所指向的地址发生了改变。
5、而返回值为引用类型的时候,地址一直都没有发生改变,所以结果就会随着地址中的值改变而发生改变。
类似于下面的代码:
String str1 = "123";
System.out.println("修改之前的 hashCode值为: "+str1.hashCode());
// 修改之前的 hashCode值为: 48690
str1 = "1234";
System.out.println("修改之后的 hashCode值为: "+str1.hashCode());
//修改之后的 hashCode值为: 1509442
Person p1 = new Person();
p1.setName("之前名字");
System.out.println("修改之前的 hashCode值为: "+p1);
//修改之前的 hashCode值为: finally和return的区别.Person@15db9742
p1.setName("之后名字");
System.out.println("修改之前的 hashCode值为: "+p1);
//修改之前的 hashCode值为: finally和return的区别.Person@15db9742