锁定老帖子 主题:finally 浅谈
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-30
IcyFenix 写道 hardPass 写道 下面的程序打印出第一次执行"finally"的深度 打印出来的值是5761、5730、5515,每次结果还都不一样 但是,我觉得,不应该执行finally,因为try还没有执行完,danteng...... public static void main(String[] args) { doSomething(); } static AtomicBoolean flag = new AtomicBoolean(true); static AtomicInteger count = new AtomicInteger(0); static void doSomething() { //int x = count.get(); //if(x>100) // return; count.incrementAndGet(); try { //System.out.println("try..." + x); doSomething(); }catch(Exception e){ e.printStackTrace(); } finally { if(flag.get()){ System.out.println("finally" + count.get()); flag.set(false); return; } doSomething(); } } 别蛋疼了,退出不一定要return,抛异常而已可以。这里有StackOverflowError出现,finally当然会执行。 关键是没有看到异常,e.printStackTrace(); |
|
返回顶楼 | |
发表时间:2010-07-30
改成
catch(Throwable e) 也不报StackOverflowError 奶奶的,为啥子? |
|
返回顶楼 | |
发表时间:2010-07-30
这问题其实比较无聊,楼主估计一时蛋疼
|
|
返回顶楼 | |
发表时间:2010-07-30
joknm 写道 我只是想知道一下是不是正的如其它人所说任东西需要后期处理的东西(比如数据链接释放之类的)都可以话到 finally 里面去处理。
。 请务必相信我的,我这个才是正确的,不关你看了什么书, 我的这个说法,是 java 作者告诉我的———玩笑玩笑。。 |
|
返回顶楼 | |
发表时间:2010-07-30
hardPass 写道 关键是没有看到异常,e.printStackTrace(); = =# 孩子,细心一些。 catch(Exception e) --> catch (Throwable e),我都提示是SOF错了,还放一个exception来抓? |
|
返回顶楼 | |
发表时间:2010-07-30
hardPass 写道 改成
catch(Throwable e) 也不报StackOverflowError 奶奶的,为啥子? } catch (Throwable e) { flag.set(false); } 看看你的程序还会不会打印。 |
|
返回顶楼 | |
发表时间:2010-07-30
这个问题其实可以分成两步来解答:
1、try...finally中变量的关系是跟方法参数传递一样的。 2、方法参数传递只有值传递,没有引用传递。 所以要理解这个问题,就要理解方法中参数是怎么传递,而这个问题之前已有高手写过贴子! |
|
返回顶楼 | |
发表时间:2010-07-30
最后修改:2010-07-30
yangguo,您确定您试过这个代码么?根本跟LZ的结果不一样啊!
|
|
返回顶楼 | |
发表时间:2010-07-30
Danteng 里面 无限递归了,必然有 StackOverflowError
但是 就算出 StackOverflowError ,也还是要执行 finally ,所有 还是 有很多很多输出。。。。 |
|
返回顶楼 | |
发表时间:2011-01-03
public class FinallyTest { public static void main(String args[]) { System.out.println("return: " + new FinallyTest().getString()); } public String getString() { String returnString = null; try { returnString = "this string will be return."; return returnString; }finally { System.out.println("execute finally..."); System.out.println("before clean returnString's value: " + returnString); returnString = null; System.out.println("after clean returnString's value: " + returnString); System.out.println("execute finally end."); } } } 今天又看这段代码,想起来问什么了?String是不可变类型,比如"a" + "b" 会生成一个新的对象, 如 String a = “1”; b = a; 会如何呢?复制,肯定是复制,即首先复制a的值,然后放如b是不? 因此return也是同样道理,首先把“returnString”的值复制出来是不,然后return回去。 |
|
返回顶楼 | |