Java finally 塊
阿新 • • 發佈:2019-05-04
有程式1需要對檔案進行讀取操,另一個程式2對想對檔案進行刪除操作;請問程式2能否成功?
回答:不能。---資原始檔一旦使用完畢,一定要釋放資原始檔,否則其他的程式無法對這個資原始檔進行操作。
引出:finally 塊
finally 塊的使用前提是必須要存在try塊才能使用。
finally 塊的程式碼在任何情況下都會執行的,除了jvm退出的情況。
finally 非常適合做資源釋放的工作,這樣子可以保證資原始檔在任何情況下都會被釋放。
第一種情況:
public class Exception_05 { public static void main(String[] args) { // TODO Auto-generated method stub div(4,0); } public static void div(int a, int b){ //第一種情況 try{ int c = a/b; System.out.println("c="+ c); }catch(Exception e){ System.out.println("出了除數為0的異常..."); throw e; }finally{ System.out.println("finall塊的程式碼執行了.."); } } }
執行結果:
Exception in thread "main" 出了除數為0的異常... finall塊的程式碼執行了.. java.lang.ArithmeticException: / by zero at test_01.Exception_05.div(Exception_05.java:34) at test_01.Exception_05.main(Exception_05.java:13)
第二種情況:
public class Exception_05 { public static void main(String[] args) { // TODO Auto-generated method stub div(4,0); } //第二種情況 public static void div(int a, int b){ try{ if(b==0){ return; } int c = a/b; System.out.println("c="+ c); }catch(Exception e){ System.out.println("出了除數為0的異常..."); throw e; }finally{ System.out.println("finall塊的程式碼執行了.."); } } }
執行結果:
finall塊的程式碼執行了..
第三種情況:
public class Exception_05 { public static void main(String[] args) { // TODO Auto-generated method stub div(4,0); } //第三種情況 public static void div(int a, int b){ try{ if(b==0){ System.exit(0);//退出jvm } int c = a/b; System.out.println("c="+ c); }catch(Exception e){ System.out.println("出了除數為0的異常..."); throw e; }finally{ System.out.println("finall塊的程式碼執行了.."); } } }
try塊的三種組合方式:
第一種: 比較適用於有異常要處理,但是沒有資源要釋放的。 try{ 可能發生異常的程式碼 }catch(捕獲的異常型別 變數名){ 處理異常的程式碼 } 第二種:比較適用於既有異常要處理又要釋放資源的程式碼。 try{ 可能發生異常的程式碼 }catch(捕獲的異常型別 變數名){ 處理異常的程式碼 }finally{ 釋放資源的程式碼; } 第三種: 比較適用於內部丟擲的是執行時異常,並且有資源要被釋放。 try{ 可能發生異常的程式碼 }finally{ 釋放資源的程式碼; }
釋放資源的程式碼:
public class finally_01 { public static void main(String[] args) { // TODO Auto-generated method stub FileReader fileReader = null; try{ //找到目標檔案 File file = new File("E:\\a.txt"); //建立程式與檔案的資料通道 fileReader = new FileReader(file); //讀取檔案 char[] buf = new char[1024]; //使用字元陣列來讀取檔案 int length = 0; length = fileReader.read(buf); //讀的過程 System.out.println("讀取到的內容:"+ new String(buf,0,length)); }catch(IOException e){ System.out.println("讀取資原始檔失敗...."); }finally{ try{ //關閉資源 fileReader.close(); System.out.println("釋放資原始檔成功...."); }catch(IOException e){ System.out.println("釋放資原始檔失敗...."); }