位元組流寫數據一共有兩種方式 throws直接拋出異常 try...catch進行異常處理,在位元組流中因為考慮到需要釋放資源,要在此基礎上加入finally塊進行釋放資源 finally:在異常處理時提供finally塊來執行所有的清楚操作。比如說IO流中的close()方法,釋放資源 特點:被fin ...
位元組流寫數據一共有兩種方式
-
throws直接拋出異常
-
try...catch進行異常處理,在位元組流中因為考慮到需要釋放資源,要在此基礎上加入finally塊進行釋放資源
finally:在異常處理時提供finally塊來執行所有的清除操作。比如說IO流中的close()方法,釋放資源
特點:被finally控制的語句一定會執行,除非JVM退出
標準格式:
try{
可能出現異常的代碼;
}catch(異常類名 變數名){
異常的處理代碼;
}finally{
執行所有清除操作;
}
代碼演示:
/*位元組流寫數據加異常處理
* */
public class Demo01 {
public static void main(String[] args) {
//try...catch..finally異常處理
//初始化文件對象
FileOutputStream fops =null;
try {
fops = new FileOutputStream("E:\\abc.txt");
fops.write("123".getBytes());
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
位元組流異常需要註意的問題:
像上面這種處理情況一般來說不會出現錯誤,但是如果我們將路徑的E盤換成一個根本就不存在的盤之後進行測試的話我們想要看到的情況是在控制台拋出一個異常,提示找不到此路徑,但實際上它拋出了兩個異常:
1.java.io.FileNotFoundException: M:\abc.txt (系統找不到指定的路徑。)
2.Exception in thread "main" java.lang.NullPointerException
at Demo040601.Demo01.main(Demo01.java:21)
第一個異常就是我們所需要的異常提示,但第二個空指針是怎麼出現的呢?我們點擊這個異常後發現原來它提示是 fops.close()釋放資源時出了問題,在代碼中查找了一下發現了問題:
我們在創建位元組流對象時將它初始化成了null,那麼在我們給了一個根本不存在的存儲盤後,電腦找不到這個路徑下的文件,那麼try裡面的代碼就不能夠被執行,那麼fops這個對象就是一個null值的狀況走到了finally,再調用一個close方法,自然就會報空指針異常
所以,為瞭解決這個問題和保證程式的健壯性我們需要在finally中進行判斷fops是否為空
/*位元組流寫數據加異常處理
* */
public class Demo01 {
public static void main(String[] args) {
//try...catch..finally異常處理
//初始化文件對象
FileOutputStream fops =null;
try {
fops = new FileOutputStream("M:\\abc.txt");
fops.write("123".getBytes());
}catch (IOException e){
e.printStackTrace();
}finally {
if (fops != null) {//fops為空時,不進行釋放資源
try {
fops.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
這樣,我們就很好地解決了空指針異常問題。