谈黑马基础题之--java证明return是在finally执行后才返回的,且在finally无法改变返回值

<a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流!



进入报名系统后,下载基础题,看了下,做到这个题目的时候产生点疑问。于是研究了下

/**
 * 第6题:写一个类证明return是在finally执行后才返回的,且在finally无法改变返回值。
 * @author somebodydie
 *
 */

一开始的时候,我也是这样写的。。以下代码截取自网络,

/*
证明return是在finally执行后才返回的,且在finally无法改变返回值。
*/
class FinallyTest
{
	public static int demo()
	{
	int a = 1;
	try 
	{
		System.out.println("try的 a:"+a);
		return a;//需要被检测的代码块
	}
	finally //一定会执行的语句
	{
		a=5;
		System.out.println("finally的 a:"+a);
		//return 15;
	}
}


public static void main(String[] args) 
	{
		System.out.println("demo:"+demo());//调用demo,如果打印结果为1证明 finally不能改变try里面的返回值
	}
}

以上代码方法跟网上大部分证明方法类似,

证明原理是: 打印结果 返回值为 1 ,所以finally不能改变try里面的返回值。 且先打印try中的内容,在打印 finally中的内容,最后打印 demo:1 所以执行顺序 是 return 在finally之后


可是我仔细想想觉得,这样只证明了 finally不能改变返回值却无法证明,finally在return 之前执行

理由: finally 和 try中的打印 是在方法内部的,正常情况也应该 在 打印 demo:1之前打印,因为本身打印语句执行的顺序都不一样。


我的代码:

public class Test6 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(prove());
	}
	
	public static int prove(){
		int i = 0;
		try{	
			i++;
			return i/0;
		}catch (Exception e){
			e.printStackTrace();
		}finally{
			i=100;
			try {
				Thread.sleep(1000);//让线程sleep 1秒
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("此处内容先输出");	
		}
		return i/0;
	}
}


在finally中我让当前线程sleep一秒,这么做是想证明一点,如果finally执行一定是在return 之前的话,那么两个return 的异常一定会等打印"此处内容先输出"

这句话之后再报出来。

但事实上运行结果是:

java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:18)
at com.itheima.Test6.main(Test6.java:11)
此处内容先输出
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:30)
at com.itheima.Test6.main(Test6.java:11)


分别注释try和最后的那个return 可得出结论:

try中return 应该是在 finally 之前执行的。

经过多次运行发现,

大多数情况  “此处内容先输出” 这句话是在 最后那个异常报出之前输出的。

但有时也会出现这种情况:

java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:18)
at com.itheima.Test6.main(Test6.java:11)
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itheima.Test6.prove(Test6.java:30)
at com.itheima.Test6.main(Test6.java:11)
此处内容先输出

这样的话,到底是最后那个return先执行,还是finally先执行?

基础题中的return 指的又是哪个return?

就有了这些疑问,表示自己才疏学浅,可能文章中有些地方有很低级的错误,希望大家指出。

也希望有大神能给出真正能证明 最后那个return 和 finally 哪个先执行的方法。









  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值