java基礎-關於異常處理

常用到的概念有throws, throw , try, catch, finally 五個關鍵字
底部有demo工程下載鏈接,實際操作一下,會更瞭解



java異常分類,具體細分還有更多,詳情直接看源碼

這裏寫圖片描述

1、throws

用來聲明方法可能會拋出什麼異常,但不對異常異性捕獲處理,也就是程序該奔潰的還是會奔潰,聲明也只是爲了提醒後來使用該方法的人,這裏有異常,用的時候要捕獲處理,不然會出問題。
使用方法:在方法名後。語法格式爲:throws 異常類型1,異常類型2…異常類型n。

例如:

public void testThrows throws IOException,SQLException{方法體}

2、throw

用來拋出一個異常,雖然方法聲明可能已經拋出異常了,但在方法執行的不同階段,可能會產生多個異常,throw的作用就是把多個不同的異常拋出來,好讓開發人員瞭解什麼時候會出現什麼類型的異常,並進行下一步處理。
使用方法:在方法體內。語法格式爲:throw 異常對象。
throw無法單用,一般要配合throws語句使用

例如和throws共用

protected void write() throws IOException,SQLException {   
        throw new IOException();

    }

又例如和try…catch公用

protected void testThrow(){
        try {
            方法體
        } catch (Exception e) {
            throw e;
        }
    }

3、try,catch ,finally

一般三個一起用,或者try… catch一起用,try..finally一起用。 其中,並行的catch可以一個,也可以多個。

例如:

private static void read(String filename) {
        try {
            InputStream in = new FileInputStream(filename);
            URL url = new URL("https://www.github.com");
        } catch (FileNotFoundException e) {
            System.out.println("發現異常了");
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } finally {
            System.out.println("到底穿山甲說了什麼");
        }
    }

catch可以不斷嵌套try…catch語句

例如:

private static void read(String filename) {
        try {
            InputStream in = new FileInputStream(filename);
        } catch (FileNotFoundException e) {
            try {
                InputStream ins = new FileInputStream(filename);
            } catch (FileNotFoundException e1) {
                e1.printStackTrace();
            }
            System.out.println("發現異常了");
        }
    }

4、哪些方法要做異常處理的?

一般IDE工具都會提示,然後按提示進行處理就行了,要麼直接throws,要麼寫try,catch處理。
通常包括:網絡http相關類,文件讀寫相關類,數據庫相關類等等

5、代碼測試

測試a

public class ExceptionTest {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("準備拋出異常");
        InputStream inputStream = new FileInputStream("text.txt");
        System.out.println("這裏不會再執行,因爲程序已經發生異常了");
    }
}

運行結果如下,直接main方法中寫InputStream方法,拋出異常
這裏寫圖片描述

測試b

public class ExceptionTest2 {
    public static void main(String[] args) throws Exception {
        exception();
        System.out.println("這裏不會再執行,因爲程序已經發生異常了");
    }

    private static void exception() throws Exception {
        System.out.println("exception 準備拋出異常");
    /*當屏蔽下面兩句,就不會拋出異常了*/
        throw new Exception();
//        InputStream inputStream = new FileInputStream("text.txt");
    }
}

運行結果如下:main方法體用到了exception()方法,該方法拋出了異常,所以調用該方法的main方法也要在聲明中拋出異常,否則報錯,這時候我們可以在exception()中直接throw new Exception(); 直接拋出異常,也可以讓下面的InputStream拋出異常
這裏寫圖片描述

測試c

public class ExceptionTest3 {
    public static void main(String[] args) {
        /*測試各方法實際效果,可以每次執行一個方法測試*/
        exception1();
//        exception2();
//        exception3();
        System.out.println("測試main,有異常也不怕");
    }

    /*用try...catch捕獲異常,並直接拋出,程序會奔潰*/
    private static void exception1() {
        try {
            System.out.println("測試Exception1,發生在異常之前");
            InputStream inputStream = new FileInputStream("text.txt");
            System.out.println("測試Exception1,發生在異常之後,由於上面的句子發生異常了,所以這句不會執行,而直接跳到catch裏面了");
        } catch (FileNotFoundException e) {
            /*這裏已經捕獲了異常,你可以用自定義方法來處理異常,也可以不處理,
            而將異常直接拋出,如果直接拋出,那麼效果和在方法聲明處 直接throws Exception是一樣的*/
            System.out.println("測試Exception1,捕獲異常,並直接拋出");
            e.printStackTrace();
        }
    }

    /*用try...catch捕獲異常,進行異常處理,不拋出*/
    private static void exception2() {
        try {
            InputStream inputStream = new FileInputStream("text.txt");
        } catch (FileNotFoundException e) {
            System.out.println("測試Exception2,捕獲到異常了,現在對它進行處理");
//            屏蔽下面這句,就不會拋出異常了
//            e.printStackTrace();
        }
    }

    /*多個catch語句, 還帶着finally語句的情況,若提前運行了System.exit(0),則finally不會執行*/
    private static void exception3() {
        try {
            InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
            InputStream inputStream = new FileInputStream("text.txt");
            System.out.println(inet1);
        } catch (FileNotFoundException e) {
            System.out.println("測試Exception3,捕獲到FileNotFoundException異常了,現在對它進行處理");
//            e.printStackTrace();
        } catch (UnknownHostException e) {
//            System.out.println("發現163訪問失敗的異常,但執行了 System.exit(0);程序終止了,也不會執行後面的語句,包括finally");
//            屏蔽這句System.exit(0); 程序才能繼續運行下去
//            System.exit(0);//System.exit(0);爲正常退出,非0則爲不正常退出,如System.exit(1);
            System.out.println("exception3 準備拋出163訪問失敗的異常");
            e.printStackTrace();
        } finally {
            System.out.println("finally總會執行的,除非程序突然System.exit了");
        }
    }
}
  • 我們在main中運行exception1()方法看看,輸出如下。用try,catch捕獲異常,並且將異常直接拋出,不做任何處理

這裏寫圖片描述

  • 接下來我們註釋exception1()方法,在運行一下exception2()方法看看效果。 捕獲到異常,對它進行處理,而不拋出異常

這裏寫圖片描述

  • 最後再註釋以上方法,來運行一下exception3()方法看看。 運用了try,catch,catch,
    finally語句,finally是在最後會運行的,當然還有一種情況finally不運行,就是系統提前System.exit(0);的時候

這裏寫圖片描述

還要注意的是,雖然exception3()中的下面兩句都會引發異常

InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
InputStream inputStream = new FileInputStream("text.txt");

但遇到第一個異常之後,程序就不會再處理下一句了,若還想在第一句遇到異常時,第二句還要保證執行的話,那就要用到嵌套的寫法的,在第一句catch{}中再嵌套一個try,catch結構


demo工程下載(intellij項目):

http://download.csdn.net/detail/forgot2015/9731942

參考文章,拓展閱讀:

http://blog.csdn.net/hguisu/article/details/6155636
http://lavasoft.blog.51cto.com/62575/18920/

個人能力有限,如有錯誤,懇請不吝賜教,謝謝

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