栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

return与finally执行对返回值影响的大论战

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

return与finally执行对返回值影响的大论战

return与finally执行对返回值影响的大论战
  • 综述
  • 情形1:改变返回值变量指向的位置
  • 情形2:改变返回值变量指向位置的内容
  • 后记

综述

return:用于跳出当前方法,指向返回值指针(指针、指针、指针…)。
finally:一定会执行。通常用于关闭资源。

函数返回的步骤:
先记录return指针位置,即此时返回值指针位置。
然后执行finally语句块,
然后返回return的指针位置。(至此函数执行结束)
所以return指针位置已固定,是不可改变的事实,一切能改变return指针位置所指向的内容的行为均可改变返回值。

只有以下两种情形,再没有其他的了哦!!!

其实这是一个关于值传递的问题

情形1:改变返回值变量指向的位置

返回指针的位置是不可改变的。
此种行为只是改变了返回值变量returnVal的指针位置;

public static String compute(String args) {
	String returnVal = "init block " + args;
	try {
		returnVal = "try block " + args;
		int i = 1 / 0;
		return returnVal;
	} catch (Exception e) {
		returnVal = "catch block " + args;
		return returnVal;
	} finally {
		returnVal = "finally block " + args;
		System.out.println("finally block 执行了哦...");
	}
}

public static void main(String[] args) {
	System.out.println(compute("你好世界。"));
}
情形2:改变返回值变量指向位置的内容

返回指针的位置是不可改变的。
此种行为是改变了返回值变量list的指针位置的内容;

public static List compute(String args) {
	List list = new ArrayList();
	list.add("init block " + args);
	try {
		list.add("try block " + args);
		int i = 1 / 0;
		return list;
	} catch (Exception e) {
		list.add("catch block " + args);
		return list;
	} finally {
		list.add("finally block " + args);
		System.out.println("finally block 执行了哦...");
	}
}

public static void main(String[] args) {
	System.out.println(compute("你好世界。"));
}
后记

其实我是为了验证spring的@AfterReturning、@AfterThrowing、@After 三种通知的执行顺序问题,而来验证的,莫名其妙的想起来了值传递的问题。

@After:无论什么情况下都会执行(对应spring源码中该通知在finally块中)。
@AfterReturning:切点方法执行返回值后执行。
@AfterThrowing:抛出异常后执行。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692387.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号