您的位置:首页 > 编程语言 > Java开发

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

2014-10-29 00:02 363 查看
对于很多新手而言,这个问题可能没有思考过,就是在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 并将结果返回
然后出现这样的原因。。笔者水平有限,无法做出解答

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: