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){}
}
}
}