关于java中的finlly里的return和throw的一些小细节

对于很多新手而言,这个问题可能没有思考过,就是在try代码块里的return,和finally里的return,到底谁执行了,还有抛出异常的情况

public class Test {
	static String str = "ok";
	public static void main(String[] args) {
		say();
	}
	public static void say()throws RuntimeException{
		try{
			throw new RuntimeException("aaa");
		}
		finally{
			throw new RuntimeException("bbb");
		}
	}
}
  <strong>1. 运行的结果是bbb即抛出的是<span style="color:#ff0000;">finally里的异常</span></strong>
<pre name="code" class="java">public class Test2 {
	public static void main(String[] args) throws Exception {
		say();
	}
	public static void say()throws Exception{
		try{
			throw new Exception("aaa");
		}
		finally{
			throw new Exception("bbb");
		}
	}
}

2.运行的结果还是bbb,所以抛出的异常和是否为运行时异常没关系

 

 
<pre name="code" class="java">public class Test7 {
	static String str = "ok";
	public static void main(String[] args) throws Exception {
		String strs = say();
		System.out.println(strs);
	}
	public static String say(){
		try{
			return str+"try";
		}
		finally{
			return str+"finally";
		}
	}
}
<strong> 3.运行的结果是okfinally,即<span style="color:#ff0000;">对于返回的是引用还是只运行了finally里的return</span></strong>
<pre name="code" class="java">public class Test8 {
	static boolean flag = false;
	public static void main(String[] args) throws Exception {
		boolean flags = say();
		System.out.println(flags);
		System.out.println(flag);
	}
	public static boolean say(){
		try{
			return flag=true;
		}
		finally{
			return flag=false;
		}
	}
}
 

4.运行的结果是false false,所以也就是还是只执行了finally的return

 
<span style="color:#ff0000;">可以看出,当try里面和finlly里面同时有return或者是抛出异常的情况,则只执行finally里面的return或者抛出异常,<strong>但是问题远没有这么简单</strong></span>
<pre name="code" class="java"><pre name="code" class="java">public class Test6 {
	static int a = 0;
	public static void main(String[] args) throws Exception {
		int s = say();
		System.out.println(s);
		System.out.println(a);
	}
	public static int say()throws Exception{
		try{
			return ++a;
		}
		finally{
			return 13;
		}
	}
}
 

5.此代码的运行结果是s为13,但是a为1而不是0,即++a被执行了
对于前面我们试了引用,布尔,结果都是只执行finally里的return,并且忽略掉try里的return语句,但是在int类型的时候,try里的return语句执行了操作(但是没有返回而是执行了finally的return语句)。然后,我依次测试了double和char,结果就是double和int一样都是在执行了try里面的return 里的语句,char则没有执行try里的return

 
<span style="color:#33cc00;">剩下几个数据类型就不测了,然后就有了一个新问题,对于int类型的时候先执行try里的return 还是先执行finally里的return?</span>于是测试代码如下
<pre name="code" class="java">public class Test12 {
	static int a = 2;
	public static void main(String[] args) throws Exception {
		int s = say();
		System.out.println(s);
		System.out.println(a);
	}
	public static int say()throws Exception{
		try{
			return a=a*a;
		}
		finally{
			return a=a*3;
		}
	}
}

结果发现a为12,即执行的先后顺序应该是先执行了try里的return,但是不返回结果,继续执行finally里的return 并将结果返回

 
然后出现这样的原因。。笔者水平有限,无法做出解答


 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值