自學Java之day20_IO異常的處理

原文鏈接:www.baidu.com

JDK7前處理

在jdk1.7之前使用try catch finally 處理流中的異常
格式:
        try{
            可能會產出異常的代碼
        }catch(異常類變量 變量名){
            異常的處理邏輯
        }finally{
            一定會指定的代碼
            資源釋放
    }

代碼舉例

public class Demo01TryCatch {
    public static void main(String[] args) {
        //提高變量fw的作用域,讓finally可以使用
        //變量在定義的時候,可以沒有值,但是使用的時候必須有值
        //fw = new FileWriter("09_IOAndProperties\\g.txt",true); 執行失敗,fw沒有值,fw.close會報錯
        FileWriter fw = null;
        try{
            //可能會產出異常的代碼
            fw = new FileWriter("w:\\09_IOAndProperties\\g.txt",true);
            for (int i = 0; i <10 ; i++) {
                fw.write("HelloWorld"+i+"\r\n");
            }
        }catch(IOException e){
            //異常的處理邏輯
            System.out.println(e);
        }finally {
            //一定會指定的代碼
            //創建對象失敗了,fw的默認值就是null,null是不能調用方法的,會拋出NullPointerException,需要增加一個判斷,不是null在把資源釋放
            if(fw!=null){
                try {
                    //fw.close方法聲明拋出了IOException異常對象,所以我們就的處理這個異常對象,要麼throws,要麼try catch
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

 JDK7的新特性

在try的後邊可以增加一個(),在括號中可以定義流對象,那麼這個流對象的作用域就在try中有效,try中的代碼執行完畢,會自動把流對象釋放,不用寫finally。
格式:
        try(定義流對象;定義流對象....){
            可能會產出異常的代碼
        }catch(異常類變量 變量名){
            異常的處理邏輯
        }

package demo06.trycatch;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
    JDK7的新特性
    在try的後邊可以增加一個(),在括號中可以定義流對象
    那麼這個流對象的作用域就在try中有效
    try中的代碼執行完畢,會自動把流對象釋放,不用寫finally
    格式:
        try(定義流對象;定義流對象....){
            可能會產出異常的代碼
        }catch(異常類變量 變量名){
            異常的處理邏輯
        }
 */
public class Demo02JDK7 {
    public static void main(String[] args) {
        try (//1.創建一個字節輸入流對象,構造方法中綁定要讀取的數據源
             FileInputStream fis = new FileInputStream("c:\\1.jpg");
             //2.創建一個字節輸出流對象,構造方法中綁定要寫入的目的地
             FileOutputStream fos = new FileOutputStream("d:\\1.jpg");) {

            //可能會產出異常的代碼
            //一次讀取一個字節寫入一個字節的方式
            //3.使用字節輸入流對象中的方法read讀取文件
            int len = 0;
            while ((len = fis.read()) != -1) {
                //4.使用字節輸出流中的方法write,把讀取到的字節寫入到目的地的文件中
                fos.write(len);
            }

        } catch (IOException e) {
            //異常的處理邏輯
            System.out.println(e);
        }


    }
}

JDK9新特性  

try的前邊可以定義流對象,在try後邊的()中可以直接引入流對象的名稱(變量名),在try代碼執行完畢之後,流對象也可以釋放掉,不用寫finally。
格式:
        A a = new A();
        B b = new B();
        try(a,b){
            可能會產出異常的代碼
        }catch(異常類變量 變量名){
            異常的處理邏輯
        }

public class Demo03JDK9 {
    public static void main(String[] args) throws IOException {
        //1.創建一個字節輸入流對象,構造方法中綁定要讀取的數據源
        FileInputStream fis = new FileInputStream("c:\\1.jpg");
        //2.創建一個字節輸出流對象,構造方法中綁定要寫入的目的地
        FileOutputStream fos = new FileOutputStream("d:\\1.jpg");

        try(fis;fos){
            //一次讀取一個字節寫入一個字節的方式
            //3.使用字節輸入流對象中的方法read讀取文件
            int len = 0;
            while((len = fis.read())!=-1){
                //4.使用字節輸出流中的方法write,把讀取到的字節寫入到目的地的文件中
                fos.write(len);
            }
        }catch (IOException e){
            System.out.println(e);
        }

        //fos.write(1);//Stream Closed

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章