­

異常類簡述

@

一、前言

作者是一位自學JAVA的小白,通過網上視頻學習和自己對JAVA核心思想一書的理解,現將自己對異常的認知描述如下:(希望能與各位同行好友共同分享自己所學的java知識,同時,也熱切期望各位同行前輩能夠幫助作者指出不足,讓小白的編程技術能更上一層樓,感謝各位同行大佬。

二、異常與錯誤的基本理解

2.1 異常與錯誤的定義

異常: 程序執行過程中發生了不正常的情況。

異常(exceptional condition)是指阻止當前方法或作用域繼續執行的問題。—–JAVA核心思想

小白理解:在程序中可以避免或者解決的錯誤。

錯誤:運行不了的代碼語句或規範。

所有的錯誤只要發生,Java就會終止程序的執行,退出JVM,錯誤不能運行。

2.2 異常分類

異常可以分為:編譯時異常(Exception)和運行時異常(RunTimeException)

編譯時異常:所有的Exception的直接子類,必須在編寫程序的時候預先對這種異常進行處理,如不處理,編譯器報錯。

運行時異常:所有的RuntimeException及子類都屬於運行時異常,運行時異常在編寫程序階段,可以不處理。

編譯時異常大概率會發生(大部分是語法、邏輯、超出類型範圍值等錯誤),運行時異常發生概率相對較小。

此處插圖

需要注意的是,編譯時異常和運行時異常,都是發生在運行階段,因為只有程序運行階段才可以new對象,異常的發生就是new異常對象,編譯時異常必須在編寫階段預先處理,如果不處理,編譯器報錯。

2.3 異常的別名

編譯時異常又稱為受控異常、受檢異常

運行時異常又稱為不受控異常、未受檢異常

三、異常的處理

異常在Java中可以看做是一種類(JAVA宗旨:一切皆可對象,要啥new啥——JAVA核心思想)

3.1 異常處理的兩種方式

                    1、使用throw,throws關鍵字(Java中自帶的異常),拋給上一級。

                   2、使用try catch語句捕獲異常

JAVA為了鼓勵人們將可能會拋出的異常告知使用此方法的前端程序員,提供了一種異常聲明的機制,它屬於方法聲明的一部分。

異常說明(throws)

//throws聲明只能拋出發生JAVA自帶的異常類
public static void main(String []args) throws 

throw(拋出)

//用於程序員自己產生拋出新建的異常類
throw new //新建的異常類

3.1 異常方法

          getMessage();

          作用:輸出簡述異常信息

Exception e=new Exception("異常錯誤");
System.out.println(e.Message);

輸出

異常錯誤

          exception.printStackTrace();

          作用:打印異常追蹤的堆棧信息,類似debug

輸出

    //輸出形式
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
	at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
	at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
	at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)

需注意的是,Java後台打印異常堆棧追蹤信息的時候,採用了異步線程的方法打印,從上往下一條條看。

3.3 異常的使用

自動拋出

小白理解:只有在main()方法throws Java自帶的異常類或者在最初調用異常語句的方法上聲明Java自帶的異常類,才能向上自動拋出,在其餘方法使用throws只能聲明發生的異常,用於提醒客戶端程序員。

//拋出聲明
public static void main(String []agrs) throws NullPointException{ }
public static void dosome()throws ClassNotFoundException{}

用例:

public class ExceptionTest04 {

    private static void m1()throws FileNotFoundException{
        m2();
    }
    private  static void  m2()throws  FileNotFoundException{
        m3();
    }
    private static void m3()throws FileNotFoundException {

        new FileInputStream("abcdsesf");
    }

    public static void main(String[] args) {

        try {
             m1();
            /**
             * 調用m1,m2,m3方法,在試圖捕捉異常後,如果捕捉到了,就不再繼續執行該方法後面的語句,轉而執行catch和finally
             */
            System.out.println("end");
        }
        catch (FileNotFoundException e) {
           String ep=e.getMessage();//以字符串形式獲取簡述異常信息
            //System.out.println(ep);//輸出簡單異常信息
            e.printStackTrace();//該方法與debug相似的功能,輸出較詳細的異常語句路徑
            System.out.println("begin");
        }
        finally {
            /**
             * 在這裡設置文件流的關閉---老猿經驗
             * finally內的代碼一定會執行
             */
              }
        System.out.println("perfect");//try catch後繼續執行

注意:
     向上依次拋時,只能是拋向他的父類對象。
     只要異常沒有捕捉,採用上拋的方式,發生異常後,異常語句後面就沒有執行。
     反之,只要try catch捕捉,當JAVA執行到try中的異常語句時,如發生異常後,停止執
     行異常後續代碼,轉而執行catch語句,try catch的下面代碼就能繼續執行。
     異常處理機制的作用是增強程序的健壯性
結果:

java.io.FileNotFoundException: abcdsesf (系統找不到指定的文件。)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
	at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
	at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
	at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)
begin
perfect

手動拋出

throw 異常對象;
//throw new Exception;

注意:Java中異常發生後如果一直採用拋出的形式,最終拋給到main()方法,main()方法繼續向上拋,最終可能導致JVM終止程序運行
捕獲

try{
     //可能發生異常的語句
   }catch(Exception e){  
    //e是一個引用變量,指向堆中的Exception
       }   
finally{

}

注意:try中包含的是可能發生異常的語句,catch能有多個,但必須按照樹狀結構,由底向上,由具體的異常到父類異常捕獲,當異常發生時,異常下面的語句不會執行,轉而執行catch和finally語句(如果有的話)。

3.4 throws和throw的區別

1、作用不同

     throw用於程序員自行產生並拋出異常, throws用於聲明在該方法內拋出了異常

2、使用的位置不同

     throw位於方法體內部,可以作為單獨語句使用

     throws必須跟在方法參數列表的後面,不能單獨使用

3、內容不同

    throw拋出一個異常對象,且只能是一個

    throws後面跟異常類,而且可以有多個。

四、final finally finalize三者之間的區別

final:是一種關鍵字,被final修飾的類,方法,變量,類不可被繼承,方法不能被重寫,變量值不能被修改,final在修飾變量時通常與static連用。

finally:是一種關鍵字,出現在異常中,finally通常與try連用,在try內沒有System.exit()語句的情況下,finally內的方法一定會被執行。

finalize:是一種標識符,是GC負責清理垃圾回收時的一種方法。

Tags: