1. 程式人生 > >Java學習心得之異常處理

Java學習心得之異常處理

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class TestException {
    
    /**
     * 任何方法往外拋能處理的異常的時候都有一種簡單的寫法:“throws Exception”,
     * 因為Exception類是所有能處理的異常類的根基類,因此丟擲Exception類就會丟擲所有能夠被處理的異常類裡了。
     * 使用“throws Exception”丟擲所有能被處理的異常之後,這些被丟擲來的異常就是交給JAVA執行時系統處理了,
     * 而處理的方法是把這些異常的相關錯誤堆疊資訊全部打印出來。
     * @throws Exception
     */
    void fn() throws Exception {
        
    }
    
    /**
     * 在知道異常的型別以後,方法宣告時使用throws把異常往外拋
     * @param i
     * @throws ArithmeticException
     */
    void m1(int i)  throws ArithmeticException {
        
    }
    
    void m2(int i) {
        if (i == 0) {
            //這種做法就是手動丟擲異常,使用“throw+new出來的異常物件”就可以把這個異常物件丟擲去了。
            //這裡是new了一個異常物件,在構建這個物件的時候還可以指定他相關的資訊,如這裡指明瞭異常資訊“i不能等於0”
            //這個物件丟擲去的時候使用getMessage()方法拿到的就是“i不能等於0”這種資訊。
            throw new ArithmeticException("i不能等於0");
        }
    }
    
    /**
     * 正常情況下如果這裡不寫try……catch語句那麼程式編譯時一定會報錯,
     * 因為這裡有可能會產生兩個個必須要處理的異常:FileNotFoundException和IOException。
     * 但由於在宣告方法f()時已經使用throws把可能產生的這兩個異常丟擲了,
     * 所以這裡可以不寫try……catch語句去處理可能會產生的異常。
     * f()方法把丟擲的異常交給下一個要呼叫它的方法去處理
     * @throws FileNotFoundException
     * @throws IOException
     */
    void f() throws FileNotFoundException, IOException {
        //這裡有可能會產生FileNotFoundException異常
        FileInputStream fis = new FileInputStream("MyFile.txt");
        //這裡有可能會產生IOException異常
        int b = fis.read();
        while (b != -1) {
            System.out.println((char)b);
            b = fis.read();
        }
    }
    
    /**
     * 在f2()方法裡面呼叫f()方法時必須要處理f()方法丟擲來的異常,
     * 當然,如果f2()方法也沒有辦法處理f()方法丟擲來的異常,那麼f2()方法也可以使用throws把異常丟擲,
     * 交給下一個呼叫了f2()的方法去處理f()方法丟擲來的異常。
     * 這裡f2()呼叫f()方法時,選擇不處理f()方法中可能丟擲的異常,將異常繼續丟擲
     * @throws Exception
     */
    void f2() throws Exception {
        f();
    }
    
    /**
     * f3方法呼叫f方法捕獲f()方法丟擲的2個異常並進行處理
     */
    void f3() {
        try {
            f();
        } catch (FileNotFoundException e) {
            System.out.println(e.getMessage());//處理的方法是把錯誤資訊打印出來
        } catch (IOException e) {
            e.printStackTrace();//處理的方法是使用printStackTrace()方法把錯誤的堆疊資訊全部打印出來。
        }
    }
    
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("MyFile.txt");
            int b = fis.read();//這個有可能會丟擲IOException異常
            while (b != -1) {
                System.out.println((char)b);
                b = fis.read();
            }
        } catch (FileNotFoundException e) {
            //使用catch捕獲FileNotFoundException類異常的異常物件e。並讓異常物件e自己呼叫printStackTrace方法打印出全部的錯誤資訊
            e.printStackTrace();
        } catch (IOException e) {
            //再次使用catch捕獲IOException類的異常物件e,並讓異常物件e自己呼叫getMessage()方法將錯誤資訊打印出來。
            System.out.println(e.getMessage());;
        }finally{
            try {
                /**
                 * 前面已經把一個檔案打開了,不管開啟這個檔案時有沒有錯誤發生,即有沒有產生異常,最後都一定要把這個檔案關閉掉,
                 * 因此使用了finally語句,在finally語句裡面不管前面這個檔案開啟時是否產生異常,在finally這裡執行in.close()都能把這個檔案關閉掉,
                 * 關閉檔案也有可能會產生異常,因此在finally裡面也使用了try……catch語句去捕獲有可能產生的異常。
                 */
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

四、自定義異常