您好,匿名用户
随意问技术百科期待您的加入

Java return 与finally

0 投票
public Map<String, Set<NearFinderData>> getDataMap() {
		Map<String, Set<NearFinderData>> latestData = null;
		lock.readLock().lock();
		try {
			latestData = NEAR_FINDER_DATA;
		} finally {
			lock.readLock().unlock();
		}
		return latestData;
	}

public Map<String, Set<NearFinderData>> getDataMap() {
		lock.readLock().lock();
		try {
			return NEAR_FINDER_DATA;
		} finally {
			lock.readLock().unlock();
		}
		
	}

的区别是什么呢?其中NEAR_FINDER_DATA 是一个被修改的Map

用户头像 提问 2012年 12月1日 @ Cassiopeia 上等兵 (317 威望)
分享到:

1个回答

0 投票
 
最佳答案

两者有一些区别,我想你可以运行看看这个例子,就可以理解了

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.test1());
        System.out.println(test.test2());
    }

    public int test1() {
        int book = 1;
        try {
            return book;
        } finally {
            book = 2;
        }
    }

    public int test2() {
        int book;
        try {
            book = 1;
        } finally {
            book = 2;
        }

        return book;
    }
}

这个例子的运行结果是

1
2

为什么在finally中都是改变的同一个变量,两者的结果会不一样呢。其实你要看它翻译成jvm的byte code就可以很好的理解了。在test1中实际上在return之前book变量已经被从stack中弹出,然后被压入一个return的stack准备弹出了,这个时候再跳入finally中的代码,无论它怎么改变book的值,但是因为最终返回的是return的stack中的最顶上的那个值,所以也不会对最终结果造成改变,因为这是两个不同的堆栈。

如果你对test1中的代码稍加改进,把finally中的代码改成return 2,那么test1的结果也是2了。这时候并不是优先执行finally中的return 2这么简单(虽然你也可以简单的这么理解),但实际上是它把2压入了return的stack,最后再跳回try中的return语句,这时候return的堆栈最顶上的值已经变成2了,所以return出来就是2了。

用户头像 回复 2012年 12月1日 @ Hecarim 上等兵 (361 威望)
选中 2012年 12月1日 @Cassiopeia
提一个问题:

相关问题

+1 投票
1 回复 71 阅读
用户头像 提问 2012年 12月31日 @ Saber 中士 (1,234 威望)
+1 投票
1 回复 312 阅读
+1 投票
1 回复 65 阅读
用户头像 提问 2012年 12月1日 @ Dionysus 上等兵 (229 威望)
0 投票
1 回复 48 阅读
0 投票
1 回复 23 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...