小說翻譯,日語相關轉移至http://blog.hjenglish.com/liwei
項目中一個try-finally語句中有return,不明白執行的順序,于是搜索了一番。http://www.usdprofits.com/finally-return-t344073.htm雖然回答的是JAVA的,但也有借鑒作用。===================================================首先執行finally,然后才執行return;如果finally里面有return,try中的return不會再執行;如果try中有了異常,return也不執行;ps:異常實際上也是一種返回值 ===================================================http://fanyaojun.bokee.com/126611.html有一段程序顯示先執行try,再finally最后return。http://www.blog.edu.cn/user1/16293/archives/2006/1248335.shtml分析了IL代碼,指出了比較根本性的原因。
但我寫了一個程序卻出現了一個怪問題。主程序清單如下:
它顯示的是什么呢?按照前面講的,先寫“finally block executed.”再輸出3可實驗結果卻是finally block executed.2
怎么回事?我也來分析下IL代碼~~以下是TestFR()的~
這里涉及到3個存儲區:堆棧,局部變量區,計算堆棧。至于它們的區別,我不是很清楚,有人知道的話,告訴我吧。01句(以下同樣只簡稱后兩位IL_0001)將數字1放到堆棧,02句彈出到局部變量0中,對應的語句就是i = 1;try中幾句是將數字2放到堆棧,再彈出到局部變量0,06句將局部變量0加載到計算堆棧。07句將其彈出到局部變量1,因為只有計算堆棧里有數據,所以彈的是計算堆棧的值。08跳到1a去,但不能跳過finally句。finally句中將數字3放到局部變量0中,再顯示字符串。而后,關鍵的地方就到了。1b句將局部變量1加載到計算堆棧,再由ret返回值。這里,為什么將局部變量1也就是數字2返回呢?不可理解呀~
posted on 2006-09-13 19:06 李威 閱讀(3945) 評論(1) 編輯 收藏
問題似乎解決了~~ 將那個程序作些小的修改(只寫修改部分了) ================================= int i = 1 ; int b; try { i = 2 ; return b = i; } ================================== 這樣,在return處設斷點就可以看明白了~return后面的語句在finally之前就執行了,b=2;也就是返回值已經確定,保存在特定區域了。finally的語句執行后b仍等于2,對返回值不起作用了。 回復 更多評論
Powered by: BlogJava Copyright © 李威