在IO流等流中如果使用了一個流那麼要在使用完畢後釋放掉它,不然它會繼續佔用內存空間,但是如果在使用中出現了異常,而我們只是將異常向上拋出,而不是自定義異常去解決,那麼只有等到在Throwable裏將程序停止,並且打印出異常後,程序纔算終止,爲了避免這種情況的發生,java爲我們提供了finally的用法,
finally再java中的定義是有一些特定的代碼無論異常是否發生,都需要執行。另外,因爲異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的.
那麼也就是說無論異常是否拋出,程序是否要關閉,方法是否要停止,finally中的語句是肯定要執行一次的.這就是他的優點,同事也就說明了他的缺點:儘量不要在finally中寫入return.一旦寫入return,程序在出現異常的時候一樣會有返回值返回到調用方法中.這樣很有可能在內存中即使保留了這個數據,這個數據也沒有實際意義.
舉個IO流的例子給大家說明一下.
使用代碼實現
寫一個實現把字符串中數據,寫入項目根目錄下的content.txt文件中.
/*
1.定義類(Test1)
2.寫一個靜態方法 void write(String content),在方法中
定義字符緩衝輸出流變量BufferedWriterbw;
寫一個try{ }catch(IOException e){ }finally{ }代碼塊
在try{ }在代碼塊中
創建BufferedWriter對象,綁定content.txt文件,賦值給bw
調用bw的write()方法,傳入content
在catch代碼塊中,打印異常信息
在finally代碼塊關閉流
寫try{}catch(IOExceptionex){} 代碼塊
在try 代碼塊中,如果bw!=null,調用bw.close()方法
在catch代碼塊,打印異常信息
3.在main方法中調用write(String conent)方法
*/
public class Test1 {
// 寫一個靜態方法 void write(Stringcontent)
public static void write(String content){
// 定義字符緩衝輸出流變量BufferedWriterbw,初始值爲null;
BufferedWriter bw = null;
// 寫一個try{ }catch(IOException e){ }finally{ }代碼塊
try{
// 在try{ }在代碼塊中
// 創建BufferedWriter對象,綁定content.txt文件,賦值給bw
bw = new BufferedWriter(new FileWriter("content.txt"));
// 調用bw的write()方法,傳入content
bw.write(content);
}catch(IOException e){
// 在catch代碼塊中,打印異常信息
e.printStackTrace();
}finally{
// 在finally代碼塊關閉流
// 寫try{}catch(IOExceptionex){} 代碼塊
try{
// 在try 代碼塊中,如果bw!=null,調用bw.close()方法
if(bw != null){
bw.close();
}
}catch(IOException ex){
// 在catch代碼塊,打印異常信息
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
write("HelloWorld");
}
}
========================================================在實際開發中,finally的用法大多數是關閉流的,所以及時在其他自定義異常中砍不到finally,也不要忽視他的作用.