1. 程式人生 > 其它 >Java基礎——位元組流寫資料加異常處理

Java基礎——位元組流寫資料加異常處理

位元組流寫資料一共有兩種方式

  1. throws直接丟擲異常

  2. 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();
              }
          }
      }
  }
}

這樣,我們就很好地解決了空指標異常問題。