1. 程式人生 > >Java finally 塊

Java finally 塊

程式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("釋放資原始檔失敗....");
            }