Java基礎(08)— 異常

異常機制

什麼是異常

  • 實際工做中,遇到的狀況不多是很是完美的。好比:你寫的某個模塊,用戶輸入不必定符合你的要求。你的程序要打開某個文件,這個文件可能不存在或者文件格式不對,你要讀取數據庫的數據,數據多是空的等。咱們的程序再跑着,內存或硬盤可能滿了。等等...java

  • 軟件程序在運行過程當中,很是可能遇到剛剛提到的這些異常問題,咱們叫異常,英文是:Exception,意思是例外。這些例外狀況,或者叫異常,怎麼讓咱們寫的程序作出合理的處理,而不至於程序崩潰程序員

  • 異常指程序運行中出現的不期而至的各類情況,如:文件找不到,網絡鏈接失敗,非法參數等數據庫

  • 異常發生在程序運行期間,它影響了正常的程序執行流程編程

  • 要理解Java異常處理是如何工做的,你須要掌握如下三種類型的異常:數組

    • 異常處理框架
    • 檢查性異常:最具表明的檢查性異常是用戶錯誤或問題引發的異常,這是程序員沒法預見的。例如要打開一個不存在文件時,一個異常就發生了,這些異常在編譯時不能被簡單地忽略
    • 運行時異常:運行時異常是能被程序員避免的異常。與檢查性異常相反,運行時異常能夠在編譯時被忽略。
    • 錯誤ERROR:錯誤不是異常,而是脫離程序員控制的問題。錯誤在代碼中一般被忽略。例如,當棧溢出時,一個錯誤就發生了,它們在編譯也檢查不到的。

異常體系結構

  • Java把異常看成對象來處理,並定義一個基類 java.lang.Throwable 做爲全部異常的超類網絡

  • 在Java API中已經定義了許多異常類,這些異常類分爲兩大類,錯誤Error和異常Exception框架

    截圖

  • Erroride

    • Error類對象由Java虛擬機生成並拋出,大多數錯誤與代碼編寫者所執行的操做無關
    • Java虛擬機運行錯誤(Virtual MachineError) ,當JVM再也不有繼續執行操做所需的內存資源時,將出現OutOfMemoryError。這些異常發生時,Java虛擬機(JVM) 通常會選擇線程終 止
    • 還有發生在虛擬機試圖執行應用時,如類定義錯誤(NoClassDefFoundError) 、連接錯誤 (LinkageError)。這些錯誤是不可查的,由於它們在應用程序的控制和處理能力以外,並且 絕大多數是程序運行時不容許出現的情況
  • Exceptionthis

    • 在Exception分支中有一個重要的子類RuntimeException (運行時異常)spa

      • ArrayIndexOutOfBoundsException (數組下標越界)

      • NullPointerException (空指針異常)

      • ArithmeticException (算術異常)

      • MissingResourceException (丟失資源)

      • ClassNotFoundException (找不到類)

      • .... 這些異常是不檢查異常,程序中能夠選擇捕獲處理,也能夠不處理

    • 這些異常通常是由程序邏輯錯誤引發的, 程序應該從邏輯角度儘量避免這類異常的發生

  • Error和Exception的區別:

    • Error一般是災難性的致命的錯誤,是程序沒法控制和處理的,當出現這些異常時,Java虛擬機(JVM)通常會選擇終止線程; Exception一般狀況下是能夠被程序處理的,而且在程序中應該儘量的去處理這些異常

Java異常處理機制

  • 拋出異常

  • 捕獲異常

  • 異常處理五個關鍵字

    • try 、catch、finally、throw、throws
    public class Demo01 {
        public static void main(String[] args) {
            int a = 1;
            int b = 0;
    //        System.out.println(a/b);//java.lang.ArithmeticException: / by zero
    
            try{ //try監控區
                System.out.println(a/b);
            }catch(ArithmeticException e){ //捕獲異常
                System.out.println("程序出現異常,變量b不能爲0");
            }finally{ //處理善後工做
                System.out.println("finally");
            }
            /*
            try catch 必需要有
            finally 能夠不要,假設IO,資源等關閉操做
             */
        }
    }
    public class Demo02 {
        public static void main(String[] args) {
            try{
               new Demo02().a();
            }catch(Error e){
                System.out.println("Error"); //進入這個,異常只能從小到大的去捕獲
            }catch (Exception e){
                System.out.println("Exception");
            }catch (Throwable e){
                System.out.println("Throwable");
            }
            finally{
                System.out.println("finally");
            }
        }
        public void a(){b();}
        public void b(){a();}
    }
    public class Demo03 {
        public static void main(String[] args) {
            int a = 1;
            int b = 0;
            //快捷鍵 Ctrl + Alt + T
            try {
                if(b == 0){
                    throw new ArithmeticException(); //主動拋出異常 throw 什麼都沒有作,通常在方法中使用
                }
                System.out.println(a/b);
            } catch (Exception e) {
                System.out.println("加入本身的邏輯...");
    //            System.exit(0);//結束程序
    //            e.printStackTrace();
            }finally {
    
            }
        }
        //假設這個方法中處理不了這個異常,在方法上拋出異常
        public void test(int a, int b) throws ArithmeticException{
            if(b == 0){
                throw new ArithmeticException(); //主動拋出異常 throw 什麼都沒有作
            }
        }
    }

自定義異常

  • 使用Java內置的異常類能夠描述在編程時出現的大部分異常狀況。除此以外,用戶還能夠自定義異常。用戶自定義異常類,只需繼承Exception類便可

  • 在程序中使用自定義異常類,大致可分爲如下幾個步驟

    • 建立自定義異常類
    • 在方法中經過throw關鍵字拋出異常對象
    • 若是在當前拋出異常的方法中處理異常,可使用try-catch語句捕獲並處理;不然在方法的聲明處經過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操做
    • 在出現異常方法的調用者中捕獲並處理異常
    //自定義異常類
    public class MyException extends Exception{
        //傳遞數字 > 10
        private int detail;
        public MyException( int detail) {
            this.detail = detail;
        }
        //toString:異常的打印信息
        @Override
        public String toString() {
            return "MyException{" +
                    "detail=" + detail +
                    '}';
        }
    }
    //應用
    public class Test {
        //可能會存在異常的方法
        static void test(int num) throws MyException{
            System.out.println("傳遞的參數爲:" + num);
            if(num > 10){
                throw new MyException(num); //拋出
            }
            System.out.println("OK");
        }
        public static void main(String[] args) {
            try {
                test(11);
            } catch (MyException e) {
                //增長一些處理異常的代碼塊
                System.out.println("MyException --> " + e);
            }
        }
    }

總結

  • 處理運行時異常時,採用邏輯去合理的規避同時輔助 try-catch 處理
  • 在多重catch塊後面,能夠加一個catch(Exception)來處理可能會被遺漏的異常
  • 對於不肯定的代碼,也能夠加上 try-catch,處理潛在的異常
  • 儘可能去處理異常,切忌只時簡單的調用printStackTrace()去打印輸出
  • 具體如何處理異常,要根據不一樣的業務需求和異常類型去解決
  • 儘可能添加finally語句塊去釋放佔用的資源
相關文章
相關標籤/搜索