實際工做中,遇到的狀況不多是很是完美的。好比:你寫的某個模塊,用戶輸入不必定符合你的要求。你的程序要打開某個文件,這個文件可能不存在或者文件格式不對,你要讀取數據庫的數據,數據多是空的等。咱們的程序再跑着,內存或硬盤可能滿了。等等...java
軟件程序在運行過程當中,很是可能遇到剛剛提到的這些異常問題,咱們叫異常,英文是:Exception,意思是例外。這些例外狀況,或者叫異常,怎麼讓咱們寫的程序作出合理的處理,而不至於程序崩潰程序員
異常指程序運行中出現的不期而至的各類情況,如:文件找不到,網絡鏈接失敗,非法參數等數據庫
異常發生在程序運行期間,它影響了正常的程序執行流程編程
要理解Java異常處理是如何工做的,你須要掌握如下三種類型的異常:數組
Java把異常看成對象來處理,並定義一個基類 java.lang.Throwable 做爲全部異常的超類網絡
在Java API中已經定義了許多異常類,這些異常類分爲兩大類,錯誤Error和異常Exception框架
Erroride
Exceptionthis
在Exception分支中有一個重要的子類RuntimeException (運行時異常)spa
ArrayIndexOutOfBoundsException (數組下標越界)
NullPointerException (空指針異常)
ArithmeticException (算術異常)
MissingResourceException (丟失資源)
ClassNotFoundException (找不到類)
.... 這些異常是不檢查異常,程序中能夠選擇捕獲處理,也能夠不處理
這些異常通常是由程序邏輯錯誤引發的, 程序應該從邏輯角度儘量避免這類異常的發生
Error和Exception的區別:
拋出異常
捕獲異常
異常處理五個關鍵字
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類便可
在程序中使用自定義異常類,大致可分爲如下幾個步驟
//自定義異常類 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); } } }