1. 程式人生 > >IO流---異常處理機制

IO流---異常處理機制

IO異常處理機制
異常就是可以預見的錯誤,java中所有的異常都從Throwable類中繼承,
不過在一般情況下都會由 Exception 類派生出來。
異常分為兩個部分:
錯誤:出現錯誤,只能終止程式
異常:出現異常,可以處理異常
異常又分為兩種:
執行時期異常,是由程式設計師自身錯誤造成的,也稱為未檢查異常,例如空指標異常、陣列越界異常等。
非執行期異常:除執行期異常外,其他都屬於非執行期異常,也叫檢查異常
異常的宣告:
異常宣告是在方法的頭部,利用關鍵字throws來表示此方法在執行的時候可能會出錯。
其實就是宣告一個異常類,在宣告之後將其丟擲。如例項1和例項3都有丟擲異常
異常的丟擲:
就是將異常拋給異常處理器,暫時不去處理它。
還有一種異常就是不斷的丟擲而不去進行處理,這是通過關鍵字throw來處理的。
因為他們的父類都是Exception,所以可以使用父類來代替所以的異常
異常丟擲的模型:
方法名 throws Exception
{
throw Exception
}
檢查異常可以分為很多種,主要分類如下:
SecurityException 由安全管理器丟擲的異常,指示存在安全侵犯。
ArithmeticException 算術異常。例如,一個整數“除以零”時
ArrayStoreException 試圖將錯誤型別的物件儲存到一個物件陣列時丟擲的異常
NullPointerException 無空間物件異常。
IllegalArgumentException 向方法傳遞了一個不合法或不正確的引數。
NegativeArraySizeException 如果應用程式試圖建立大小為負的陣列,則丟擲該異常。
ArrayIndexOutOfBoundsException 用非法索引訪問陣列時丟擲的異常
IOException IO異常,當發生某種 I/O 異常時,丟擲此異常

import java.io.*;
class  ExceptionDemo {
    public static void main(String[] args) {
        //在try之前建立檔案流物件引用,try時再在內部初始化。
        //因為finally要執行關閉流的操作
        FileWriter fw = null;
        //檢測異常
        try{
            //建立物件實體並與指定目錄下的檔案關聯,如果目錄不存在就會報找不到路徑異常。
            fw = new FileWriter("txt1\\txt-1.txt"
); //寫入資料到流中。 fw.write("Hello World"); } //捕獲異常 catch (IOException e){ System.out.println("錯誤:"+e.toString()); } //最後要關閉流,關閉流也要檢測異常。 finally{ try{ //先判斷如果物件不為null,表示有物件實體--流,就關閉流 if
(fw!=null) fw.close(); } catch (IOException e){ System.out.println("錯誤:"+e.toString()); } } } }

練習:
將某個檔案從C盤複製到D盤
複製的原理:
其實就是將C盤下的檔案資料儲存到D盤的一個檔案中。
步驟:
1、在D盤建立一個檔案,用於儲存C盤檔案中的資料。
2、定義讀取流和C盤檔案關聯。
3、通過不斷的讀寫(迴圈讀寫)完成資料儲存。
4、關閉資源。
可以用兩種方式實現,如例項6和例項7,主要是例項7。
複製文字檔案方式1

import java.io.*;
class  CopyFileDemo{
    public static void main(String[] args) throws IOException{
        //建立檔案寫入流--目的地
        FileWriter fw = new FileWriter("txt\\txt-Copy.txt");
        //建立檔案讀取流--原始檔
        FileReader fr = new FileReader("txt\\txt-1.txt");
        //從檔案讀取流中讀取所有檔案到寫入流中。
        int ch = 0;
        while((ch=fr.read())!=-1){
            fw.write(ch);                                  
        }
        //關閉兩個流
        fw.close();
        fr.close();
    }
}

由於上面的程式碼沒有對程式可能出現的異常進行處理,
下面將詳細檢測和處理異常。並對程式碼進行優化。

import java.io.*;
class  CopyFileTest{
    public static void main(String[] args) throws IOException{
        //建立寫入流和讀取流的物件引用
        FileWriter fw = null;
        FileReader fr = null;
        //檢測異常
        try{
            //建立物件實體-原始檔和目的檔案
            fw = new FileWriter("txt\\txt-1 附件.txt");
            fr = new FileReader("txt\\txt-1.txt");
            //建立字元陣列,用於儲存讀到的字元資料
            char[] buf = new char[1024];    
            int len = 0;
            while((len=fr.read(buf))!=-1){
                //寫入字元陣列從0到len部分。一次性寫入
                fw.write(buf,0,len);           
            }
        }
        //處理異常
        catch (IOException e){                        
            throw new RuntimeException("讀寫失敗!");    
        }
        //最終要執行關閉2個流的動作。
        finally{
            //關閉前要判斷流是否存在,存在就關閉,關閉動作也要進行異常處理
            if(fr!=null)
                try{fr.close();}
                catch (IOException e){}
            if(fw!=null)
                try{fw.close();}
                catch (IOException e){}
        }
    }
}