本文目錄一覽:
- 1、java中為什麼用finally語句
- 2、java finally什麼時候執行
- 3、finally在java的用法是什麼?
- 4、java中final,finally和finalize的區別
- 5、java中finally問題
- 6、Java 異常中的一個疑惑—finally存在的意義
java中為什麼用finally語句
比如說
連接數據庫
try{
.open();//打開連接
正常運行
}catch(){
出現錯誤進入catch
}finally{
.close();//關閉連接
}
不管是正常運行還是出現錯誤都需要關閉數據庫
,所以把.close();放入finally中,就是為了防止出錯之後程序不往下運行了,所以才有了finally
java finally什麼時候執行
在Java語言的異常處理中,finally塊的作用就是為了保證無論出現什麼情況,finally塊里的代碼一定會被執行。由於程序執行return就意味着結束對當前函數的調用並跳出這個函數體,因此任何語句要執行都只能在return前執行(除非碰到exit函數),因此finally塊里的代碼也是在return之前執行的。此外,如果try-finally或者catch-finally中都有return,那麼finally塊中的return將會覆蓋別處的return語句,最終返回到調用者那裡的是finally中return的值。
finally在java的用法是什麼?
finally常用來處理java一些後續的工作.
在java的的finally首先必須使用在所有catch的最後位置,其次它是必須執行的,無條件執行,甚至即使前面的try-catch語句中已經存在異常了,它仍然會執行.
不管try語句塊正常結束還是異常結束,finally語句塊是保證要執行的.如果try語句塊正常結束,那麼在try語句塊中的語句都執行完之後,再執行finally語句塊.
java中final,finally和finalize的區別
1. final
在java中,final可以用來修飾類,方法和變量(成員變量或局部變量)。下面將對其詳細介紹。
1.1 修飾類
當用final修飾類的時,表明該類不能被其他類所繼承。當我們需要讓一個類永遠不被繼承,此時就可以用final修飾,但要注意:
final類中所有的成員方法都會隱式的定義為final方法。
1.2 修飾方法
使用final方法的原因主要有兩個:
(1) 把方法鎖定,以防止繼承類對其進行更改。
(2) 效率,在早期的java版本中,會將final方法轉為內嵌調用。但若方法過於龐大,可能在性能上不會有多大提升。因此在最近版本中,不需要final方法進行這些優化了。
final方法意味着「最後的、最終的」含義,即此方法不能被重寫。
注意:若父類中final方法的訪問權限為private,將導致子類中不能直接繼承該方法,因此,此時可以在子類中定義相同方法名的函數,此時不會與重寫final的矛盾,而是在子類中重新地定義了新方法。
1.3 修飾變量
final成員變量表示常量,只能被賦值一次,賦值後其值不再改變。類似於C++中的const。
當final修飾一個基本數據類型時,表示該基本數據類型的值一旦在初始化後便不能發生變化;如果final修飾一個引用類型時,則在對其初始化之後便不能再讓其指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。
final修飾一個成員變量(屬性),必須要顯示初始化。這裡有兩種初始化方式,一種是在變量聲明的時候初始化;第二種方法是在聲明變量的時候不賦初值,但是要在這個變量所在的類的所有的構造函數中對這個變量賦初值。
當函數的參數類型聲明為final時,說明該參數是只讀型的。即你可以讀取使用該參數,但是無法改變該參數的值。
2. finally
finally作為異常處理的一部分,它只能用在try/catch語句中,並且附帶一個語句塊,表示這段語句最終一定會被執行(不管有沒有拋出異常),經常被用在需要釋放資源的情況下。(×)(這句話其實存在一定的問題)
很多人都認為finally語句塊一定會執行,但真的是這樣么?答案是否定的,例如下面這個例子:
只有與finally對應的try語句塊得到執行的情況下,finally語句塊才會執行。以上兩種情況在執行try語句塊之前已經返回或拋出異常,所以try對應的finally語句並沒有執行。
3. finalize
finalize()是在java.lang.Object里定義的,也就是說每一個對象都有這麼個方法。這個方法在gc啟動,該對象被回收的時候被調用。其實gc可以回收大部分的對象(凡是new出來的對象,gc都能搞定,一般情況下我們又不會用new以外的方式去創建對象),所以一般是不需要程序員去實現finalize的。
特殊情況下,需要程序員實現finalize,當對象被回收的時候釋放一些資源,比如:一個socket鏈接,在對象初始化時創建,整個生命周期內有效,那麼就需要實現finalize,關閉這個鏈接。
使用finalize還需要注意一個事,調用super.finalize();
一個對象的finalize()方法只會被調用一次,而且finalize()被調用不意味着gc會立即回收該對象,所以有可能調用finalize()後,該對象又不需要被回收了,然後到了真正要被回收的時候,因為前面調用過一次,所以不會調用finalize(),產生問題。 所以,推薦不要使用finalize()方法,它跟析構函數不一樣。
java中finally問題
原因如下:
你放在finally裏面的時候,可以保證,當你的線程異常終止的時候,finally裏面的語句也可以得到執行,例如:執行一些關閉數據庫或者文件I/O流的操作。
而你放在下面的時候,程序一旦終止,下面語句根本不會得到執行的,會異常終止在try裏面的
Java 異常中的一個疑惑—finally存在的意義
try-catch塊中執行到return並不會直接返回結果,而是先去執行finally塊,再返回先前的值,除非finally中有return,finally中的return會破壞程序的完整性且抑制方法產生的異常,不要使用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/302881.html