Java中Finally症結字。本站提示廣大學習愛好者:(Java中Finally症結字)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中Finally症結字正文
final:制止多態開關~
潤飾變量:變量不克不及被轉變
潤飾類:類不克不及被繼續
潤飾辦法:辦法不克不及被重寫
finally:用在異常處置的最初一個語句塊
不管能否發生異常都要被履行~~~
Java代碼
public final class FinallyTest { public static void main(String[] args) { try { throw new NullPointerException(); } catch (NullPointerException e) { System.out.println("法式拋出了異常"); } finally { System.out.println("履行了finally語句塊"); } } }
Java中finally症結字的應用
與其他說話的模子比擬,finally 症結字是對 Java 異常處置模子的最好彌補。finally 構造使代碼總會履行,而不論有沒有異常產生。應用 finally 可以保護對象的外部狀況,並可以清算非內存資本。 假如沒有 finally,您的代碼就會很隱晦。例如,上面的代碼解釋,在不應用 finally 的情形下您必需若何編寫代碼來釋放非內存資本:
import java.net.*; import java.io.*; class WithoutFinally { public void foo() throws IOException { //在任一個余暇的端口上創立一個套接字 ServerSocket ss = new ServerSocket(0); try { Socket socket = ss.accept(); //此處的其他代碼... } catch (IOException e) { ss.close(); //1 throw e; } //... ss.close(); //2 } }
這段代碼創立了一個套接字,並挪用 accept 辦法。在加入該辦法之前,您必需封閉此套接字,以免資本破綻。為了完成這一義務,我們在 //2 處挪用 close,它是該辦法的最初一條語句。然則,假如 try 塊中產生一個異常會怎樣樣呢?在這類情形下,//2 處的 close 挪用永久不會產生。是以,您必需捕捉這個異常,並在從新收回這個異常之前在 //1 處拔出對 close 的另外一個挪用。如許便可以確保在加入該辦法之前封閉套接字。
如許編寫代碼既費事又易於失足,但在沒有 finally 的情形下這是必弗成少的。不幸的是,在沒有 finally 機制的說話中,法式員便可能忘卻以這類方法組織他們的代碼,從而招致資本破綻。Java 中的 finally 子句處理了這個成績。有了 finally,後面的代碼便可以重寫為以下的情勢:
import java.net.*; import java.io.*; class WithFinally { public void foo2() throws IOException { //在任一個余暇的端口上創立一個套接字 ServerSocket ss = new ServerSocket(0); try { Socket socket = ss.accept(); //此處的其他代碼... } finally { ss.close(); } } }
finally 塊確保 close 辦法總被履行,而不論 try 塊內能否收回異常。是以,可以確保在加入該辦法之前總會挪用 close 辦法。如許您便可以確信套接字被封閉而且您沒有洩露資本。在此辦法中不須要再有一個 catch 塊。在第一個示例中供給 catch 塊只是為了封閉套接字,如今這是經由過程 finally 封閉的。假如您確切供給了一個 catch 塊,則 finally 塊中的代碼在 catch 塊完成今後履行。
finally 塊必需與 try 或 try/catch 塊合營應用。另外,弗成能加入 try 塊而不履行其 finally 塊。假如 finally 塊存在,則它總會履行。(不管從那點看,這個陳說都是准確的。有一種辦法可以加入 try 塊而不履行 finally 塊。假如代碼在 try 外部履行一條 System.exit(0); 語句,則運用法式終止而不會履行 finally 履行。另外一方面,假如您在 try 塊履行時代撥失落電源,finally 也不會履行。)