一、異常概述和繼承體系 二、緣由及處理方式 三、運行時異常 四、重寫異常處理 五、Throwable類常見方法 六、自定義異常

01異常的概述

* A: 異常的概述
    * a:什麼是異常
        * Java代碼在運行時期發生的問題就是異常。
    * b:異常類
        * 在Java中,把異常信息封裝成了一個類。
        * 當出現了問題時,就會建立異常類對象並拋出異常相關的信息(如異常出現的位置、緣由等)。
    * c:咱們見過的異常:數組角標越界異常ArrayIndexOutOfBoundsException,空指針異常NullPointerException

02異常的繼續體系和錯誤的區別

* A: 異常的繼承體系
    Throwable: 它是全部錯誤與異常的超類(祖宗類)
        |- Error 錯誤
        |- Exception 編譯期異常,進行編譯JAVA程序時出現的問題
            |- RuntimeException 運行期異常, JAVA程序運行過程當中出現的問題
* B:異常與錯誤的區別
    * a:異常
        * 指程序在編譯、運行期間發生了某種異常(XxxException),咱們能夠對異常進行具體的處理。
        * 若不處理異常,程序將會結束運行。
        * 案例演示:
            public static void main(String[] args) {
                int[] arr = new int[3];
                System.out.println(arr[0]);
                System.out.println(arr[3]);
                // 該句運行時發生了數組索引越界異常ArrayIndexOutOfBoundsException,
                // 因爲沒有處理異常,致使程序沒法繼續執行,程序結束。
                System.out.println("over"); // 因爲上面代碼發生了異常,此句代碼不會執行
            }
            
    * b:錯誤
        * 指程序在運行期間發生了某種錯誤(XxxError),Error錯誤一般沒有具體的處理方式,程序將會結束運行。
        * Error錯誤的發生每每都是系統級別的問題,都是jvm所在系統發生的,並反饋給jvm的。
        * 咱們沒法針對處理,只能修正代碼。
        * 案例演示:
            public static void main(String[] args) {
                int[] arr = new int[1024*1024*100];
                //該句運行時發生了內存溢出錯誤OutOfMemoryError,開闢了過大的數組空間,
                //致使JVM在分配數組空間時超出了JVM內存空間,直接發生錯誤。
            }

03異常對象的產生緣由和處理方式

* A: 異常對象的產生緣由
    * 案例代碼:
        * 工具類
        class ArrayTools{
            //對給定的數組經過給定的角標獲取元素。
            public static int getElement(int[] arr,int index)    {
                int element = arr[index];
                return element;
            }
        }
        * 測試類
        class ExceptionDemo2 {
            public static void main(String[] args)     {
                int[] arr = {34,12,67};
                int num = ArrayTools.getElement(arr,4)
                System.out.println("num="+num);
                System.out.println("over");
            }
        }
    * 緣由分析:
        * a: 因爲沒找到4索引,致使運行時發生了異常。這個異常JVM認識:ArrayIndexOutOfBoundsException。
            這個異常Java自己有描述:異常的名稱、異常的內容、異常的產生位置。
            java將這些信息直接封裝到異常對象中。new ArrayIndexOutOfBoundsException(4);
        * b:throw new ArrayIndexOutOfBoundsException(4);產生異常對象。JVM將產生的異常拋給調用者main()方法。
        * c:main()方法接收到了數組索引越界異常對象。
            因爲main()方法並無進行處理異常,main()方法就會繼續把異常拋給調用者JVM。
            當JVM收到異常後,將異常對象中的名稱、異常內容、位置都顯示在就控制檯上。同時讓程序馬上終止。
* B:異常的處理方式
    * a:JVM的默認處理方式
        * 把異常的名稱,緣由,位置等信息輸出在控制檯,同時會結束程序。
        * 一旦有異常發生,其後來的代碼不能繼續執行。
    * b:解決程序中異常的手動方式
        * a):編寫處理代碼 try...catch...finally
        * b):拋出 throws

04方法內部拋出對象throw關鍵字

在java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象。
* A: 何時使用throw關鍵字?
    * 當調用方法使用接受到的參數時,首先須要先對參數數據進行合法的判斷,
      數據若不合法,就應該告訴調用者,傳遞合法的數據進來。
      這時須要使用拋出異常的方式來告訴調用者。
* B: 使用throw關鍵字具體操做
    * a: 建立一個異常對象。封裝一些提示信息(信息能夠本身編寫)。
    * b: 經過關鍵字throw將這個異常對象告知給調用者。throw 異常對象;
    throw 用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行。
* C: throw關鍵字使用格式
    * throw new 異常類名(參數);
    * 例如:
        throw new NullPointerException("要訪問的arr數組不存在");
        throw new ArrayIndexOutOfBoundsException("該索引在數組中不存在,已超出範圍");
* D:案例演示
    * throw的使用

05方法聲明異常關鍵字throws

* A: 聲明
    * 將問題標識出來,報告給調用者。若是方法內經過throw拋出了編譯時異常,而沒有捕獲處理(稍後講解該方式),那麼必須經過throws進行聲明,讓調用者去處理。
* B: 聲明異常格式
    * 修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2… {   }
* C:注意事項:
    * throws用於進行異常類的聲明,若該方法可能有多種異常狀況產生,那麼在throws後面能夠寫多個異常類,用逗號隔開。
* D:代碼演示:
    * 多個異常的處理

==============================第二節課開始====================================java

06try...catch異常處理

* A: 捕獲
    * Java中對異常有針對性的語句進行捕獲,能夠對出現的異常進行指定方式的處理
* B: 捕獲異常格式
    try {
        //須要被檢測的語句。
    }
    catch(異常類 變量) { //參數。
        //異常的處理語句。
    }
    finally {
        //必定會被執行的語句。
    }
* C: 格式說明
    * a: try
        * 該代碼塊中編寫可能產生異常的代碼。
    * b: catch
        * 用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
    * c: finally:
        * 有一些特定的代碼不管異常是否發生,都須要執行。
        * 另外,由於異常會引起程序跳轉,致使有些語句執行不到。
        * 而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是必定會被執行的。
    * d:try...catch...處理掉異常後,程序能夠繼續執行
* D:案例演示
    * 捕獲異常格式

07多catch處理

* A:一個try 多個catch組合 
    * 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對每種異常信息進行不一樣的捕獲處理。
* B:多catch處理的格式
    void show(){ //不用throws 
        try{
            throw new Exception();//產生異常,直接捕獲處理
        }catch(XxxException e){
            //處理方式    
        }catch(YyyException e){
            //處理方式    
        }catch(ZzzException e){
            //處理方式    
        }
    }
    注意事項:在捕獲異常處理中,變量也是有做用域的,如能夠定義多個catch中異常變量名爲e。

08多catch處理細節

* A:細節:多個catch小括號中,寫的是異常類的類名,有沒有順序的概念?
    * 有順序關係。
* B:平級異常:
    * 拋出的異常類之間,沒有繼承關係,沒有順序
        NullPointerException extends RuntimeException
        NoSuchElementException extends RuntimeException
        ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException extends RuntimeException
* C:上下級關係的異常
    * 越高級的父類,越寫在下面
        NullPointerException extends RuntimeException extends Exception

09finally代碼塊

* A: finally的特色
    * 被finally控制的語句體必定會執行
* B:finally的做用
    * finally,不管程序是否有異常出現,程序必須執行釋放資源在
      如:IO流操做和數據庫操做中會見到

10調用拋出異常方法try和throws處理方式

* A: 在實際開發中使用哪一種異常處理方式呢?
    * 能本身處理的儘可能本身處理。(建議用try...catch)

==============================第三節課開始====================================數據庫

11運行時期異常的特色

* A: 運行時期異常的概述: 
    * RuntimeException和他的全部子類異常,都屬於運行時期異常。
        NullPointerException,ArrayIndexOutOfBoundsException等都屬於運行時期異常.
* B:運行時期異常的特色
    * a:方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常。
    * b:運行時期異常一旦發生,須要程序人員修改源代碼。
    設計緣由:
        運行異常,不能發生,可是若是發生了,程序人員中止程序修改源代碼
        運行異常: 一旦發生,不要處理,請你修改源代碼,運行異常一旦發生,後面的代碼沒有執行的意義

12運行異常的案例

* A: 計算圓的面積案例
    定義方法,計算圓形的面積
    傳遞參數0,或者負數,計算的時候沒有問題
    可是,違反了真實狀況
    參數小於=0, 中止程序,不要在計算了
* B:數組索引越界案例
    使用數組中不存在的索引
    public class RuntimeExceptionDemo {
        public static void main(String[] args) {
                double d = getArea(1);
                System.out.println(d);
        }
        
        /*
         *  定義方法,計算圓形的面積
         *  傳遞參數0,或者負數,計算的時候沒有問題
         *  可是,違反了真實狀況
         *  參數小於=0, 中止程序,不要在計算了
         */
        public static double getArea(double r){
            if(r <= 0)
                throw new RuntimeException("圓形不存在");
            return r*r*Math.PI;
        }
        
        public static void function(){
            int[] arr = {1,2,3};
            //對數組的5索引進行判斷,若是5索引大於100,請將5索引上的數據/2,不然除以3
            //索引根本就沒有
            if(arr[5] > 100){
                arr[5] = arr[5]/2;
            }else{
                arr[5] = arr[5]/3;
            }
    }

13方法重寫時候異常的處理

* A:方法重寫時候異常的處理
    * a:子類覆蓋父類方法時,若是父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明。
        例如:
        class Fu {
            public void method () throws RuntimeException {
            }
        }
        class Zi extends Fu {
            public void method() throws RuntimeException { }  //拋出父類同樣的異常
            //public void method() throws NullPointerException{ } //拋出父類子異常
        }
    * b:當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集。
        例如:
        class Fu {
            public void method () throws NullPointerException, ClassCastException{
            }
        }
        class Zi extends Fu {
            public void method()throws NullPointerException, ClassCastException { }          
            public void method() throws NullPointerException{ } //拋出父類異常中的一部分
            public void method() throws ClassCastException { } //拋出父類異常中的一部分
        }
    * c:當被覆蓋的方法沒有異常聲明時,子類覆蓋時沒法聲明異常的。
        例如:
        class Fu {
            public void method (){
            }
        }
        class Zi extends Fu {
            public void method() throws Exception { }//錯誤的方式
        }
* B:問題:父類中會存在下列這種狀況,接口也有這種狀況。
            接口中沒有聲明異常,而實現的子類覆蓋方法時發生了異常,怎麼辦?
     回答:沒法進行throws聲明,只能catch的捕獲。
            萬一問題處理不了呢?catch中繼續throw拋出,可是隻能將異常轉換成RuntimeException子類拋出。

14Throwable類方法

* A: 常見方法
    * a:getMessage()方法
        返回該異常的詳細信息字符串,即異常提示信息
    * b:toString()方法
        返回該異常的名稱與詳細信息字符串
    * c:printStackTrace()方法
        在控制檯輸出該異常的名稱與詳細信息字符串、異常出現的代碼位置
* B:案例演示
    異常的經常使用方法代碼演示
        try {
            Person p= null;
            if (p==null) {
                throw new NullPointerException(「出現空指針異常了,請檢查對象是否爲null」);
            }
        } catch (NullPointerException e) {
            String message = e.getMesage();
            System.out.println(message ); 
            
            String result = e.toString();
            System.out.println(result);    
            
            e.printStackTrace(); 
        }

======================第四節課開始=========數組

15自定義異常

* A: 自定義異常的定義
    * a:經過閱讀源碼,發現規律:
        每一個異常中都調用了父類的構造方法,把異常描述信息傳遞給了父類,讓父類幫咱們進行異常信息的封裝。
    * b:格式:
        Class 異常名 extends Exception{ //或繼承RuntimeException
            public 異常名(){
            }
            public 異常名(String s){ 
                super(s); 
            }
        }    
    
    * c:自定義異常繼承Exception演示
    * d:自定義異常繼承RuntimeException演示
* B:自定義異常的練習
    在Person類的有參數構造方法中,進行年齡範圍的判斷,
    若年齡爲負數或大於200歲,則拋出NoAgeException異常,異常提示信息「年齡數值非法」。
    要求:在測試類中,調用有參數構造方法,完成Person對象建立,並進行異常的處理。

* C:關於構造方法拋出異常總結
    構造函數到底拋出這個NoAgeException是繼承Exception呢?仍是繼承RuntimeException呢?
    * a:繼承Exception,必需要throws聲明,一聲明就告知調用者進行捕獲,一旦問題處理了調用者的程序會繼續執行。
    * b:繼承RuntimeExcpetion,不須要throws聲明的,這時調用是不須要編寫捕獲代碼的,由於調用根本就不知道有問題。
        一旦發生NoAgeException,調用者程序會停掉,並有jvm將信息顯示到屏幕,讓調用者看到問題,修正代碼。

16總結

  • 把今天的知識點總結一遍。jvm

相關文章
相關標籤/搜索