Java 中的異常(Exception)又稱爲例外,是一個在程序執行期間發生的事件,它中斷正在執行的程序的正常指令流。爲了可以及時有效地處理程序中的運行錯誤,必須使用異常類。java
Throwable是Java中異常的根類,它有兩個子類:程序員
Exception:是程序自己能夠處理的異常。異常處理一般就是針對這種類型異常的處理。它也能夠細分爲兩個方向:數據庫
非檢查異常(運行時異常):編譯器不要求強制處理的異常,程序員能夠無論也能夠捕獲。數組
例:空指針異常、數組下標越界、算數異常、類型轉換異常等等緩存
檢查異常:編譯器要求必須處理的異常,不然通不過變異安全
例:IO異常、SQL異常多線程
Error:是程序沒法處理的錯誤,表示運行應用程序中較嚴重的問題。常見的有:虛擬機錯誤、內存溢出、線程死鎖。jvm
1 異常類型 2 Throwable 3 錯誤Error 4 錯誤不是異常,程序沒法處理的錯誤,表示運行應用程序中較嚴重的問題。 5 常見的有:虛擬機錯誤、內存溢出(堆棧溢出)、線程死鎖。 6 錯誤類 7 VirtualMachineError 虛擬機錯誤 8 OutOfMemoryError 內存溢出錯誤類 9 StackOverflowError 棧溢出錯誤類 10 LinkageError 連接錯誤類 11 NoClassDefFoundError 類定義未找到錯誤類 12 AWTError 圖形用戶界面錯誤類 13 異常Exception 14 是程序自己能夠處理的異常。異常處理一般就是針對這種類型異常的處理。 15 檢查性異常 16 用戶錯誤或問題引發的異常,這是程序員沒法預見的,是必須進行處理的異常,若是不處理,程序就不能編譯經過。 17 java內置的非運行時異常 18 ClassNotFoundException 應用程序試圖加載類時,找不到相應的類,拋出該異常。 19 InterruptedException 一個線程被另外一個線程中斷,拋出該異常。 20 IOException I/O 異常的根類 21 EOFException 文件結束 22 FileNotFoundException 找不到文件 23 SQLException 操做數據庫異常 24 NoSuchFieldException 請求的變量不存在 25 NoSuchMethodException 請求的方法不存在 26 CloneNotSupportedException 當調用 Object 類中的 clone 方法克隆對象,但該對象的類沒法實現 Cloneable 接口時,拋出該異常。 27 IllegalAccessException 拒絕訪問一個類的時候,拋出該異常。 28 InstantiationException 當試圖使用 Class 類中的 newInstance 方法建立一個類的實例,而指定的類對象由於是一個接口或是一個抽象類而沒法實例化時,拋出該異常。 29 運行時異常 30 通常由程序邏輯錯誤引發,是可能被程序員避免的異常。在編譯時被忽略,程序中能夠選擇捕獲處理,也能夠不處理。 31 RuntimeException 32 NullPointerException 當應用程序試圖在須要對象的地方使用 null 時,拋出該異常 33 ArithmeticException 當出現異常的運算條件時,拋出此異常。例如,一個整數"除以零"時,拋出此類的一個實例。 34 ClassCastException 當試圖將對象強制轉換爲不是實例的子類時,拋出該異常。 35 NumberFormatException 當應用程序試圖將字符串轉換成一種數值類型,但該字符串不能轉換爲適當格式時,拋出該異常。 36 IllegalMonitorStateException 拋出的異常代表某一線程已經試圖等待對象的監視器,或者試圖通知其餘正在等待對象的監視器而自己沒有指定監視器的線程。 37 IndexOutOfBoundsException 指示某排序索引(例如對數組、字符串或向量的排序)超出範圍時拋出。 38 StringIndexOutOfBoundsException 此異常由 String 方法拋出,指示索引或者爲負,或者超出字符串的大小。 39 ArrayIndexOutOfBoundsException 用非法索引訪問數組時拋出的異常。若是索引爲負或大於等於數組大小,則該索引爲非法索引。 40 IllegalArgumentException 拋出的異常代表向方法傳遞了一個不合法或不正確的參數。 41 UnsupportedOperationException 當不支持請求的操做時,拋出該異常。 42 ArrayStoreException 試圖將錯誤類型的對象存儲到一個對象數組時拋出的異常。 43 IllegalStateException 在非法或不適當的時間調用方法時產生的信號。換句話說,即 Java 環境或 Java 應用程序沒有處於請求操做所要求的適當狀態下。 44 IllegalThreadStateException 線程沒有處於請求操做所要求的適當狀態時拋出的異常。 45 NegativeArraySizeException 若是應用程序試圖建立大小爲負的數組,則拋出該異常。 46 SecurityException 由安全管理器拋出的異常,指示存在安全侵犯。 47 用戶自定義的Exception異常 48 全部異常都必須是 Throwable 的子類。 49 若是但願寫一個檢查性異常類,則須要繼承 Exception 類。 50 若是你想寫一個運行時異常類,那麼須要繼承 RuntimeException 類。
異常處理方法:ide
捕獲異常
聲明異常
拋出異常spa
Java 的異常處理經過 5 個關鍵字來實現:try、catch、throw、throws 和 finally。
try catch 語句用於捕獲並處理異常,finally 語句用於在任何狀況下(除特殊狀況外)都必須執行的代碼,
throw 語句用於拋出異常,
throws 語句用於聲明可能會出現的異常。
throws 在方法(類)的聲明處聲明可能要拋出的異常,一般不用顯示地捕獲異常,可由系統自動將全部捕獲的異常信息拋給上級方法;
當一個方法產生一個它不處理的異常時,那麼就須要在該方法的頭部聲明這個異常,以便將該異常傳遞到方法的外部進行處理。
子類方法拋出的異常不會超過父類定義的範圍。子類在覆蓋父類帶 throws 子句的方法時,子類的方法聲明中的 throws 子句不能出現父類對應方法的 throws 子句中沒有的異常類型,
也能夠申明未檢查的異常,但這不是編譯器強制的。若是方法拋出了異常那麼調用這個方法的時候就須要將這個異常處理或者繼續拋出。
throw 在方法(類)內部手動拋出一個具體的異常類型。須要用戶本身捕獲相關的異常,然後再對其進行相關包裝,最後將包裝後的異常信息拋出。
按照語法你能夠拋出任意 Throwable (i.e. Throwable或任何Throwable的衍生類) , throw能夠中斷程序運行,所以能夠用來代替return。
最多見的例子是用 throw 在一個空方法中須要return的地方拋出 UnSupportedOperationException
1 異常處理 2 捕獲異常 3 try 執行可能產生異常的代碼 4 catch 捕獲異常 5 finally 6 finally 用於和try{}catch(){}finally{}組合進行異常處理。用於釋放資源,在IO流操做、數據庫操做、保證unlock鎖 中會見到。 7 特色: 8 1) 無論有沒有出現異常,被finally控制的語句體必定會執行。 9 特殊狀況 10 1. 在執行到finally以前jvm退出了(好比System.exit(0)) 11 2. try語句中無限循環; 12 3. 線程被殺死; 13 2) 當try和catch中有return時,finally仍然會執行; 14 3) finally是在retrun後面的表達式運算後執行的,不會影響返回值。 15 (此時並無真的return,而是先把要return的值保存起來,無論最後中的代碼怎麼樣,返回的值都不會改變,仍然是以前保存的值) 16 4) finally中間好不要包含返回,不然程序會提早退出,返回值不是try和catch中保存的返回值 17 return 18 1) 當try或者catch中有返回值,可是finaly中也有返回語句時,最終返回的是finally中的返回值。 19 2) 當try或者catch進行了return,可是finally中對返回值進行了修改,返回值在try中被緩存了,後面的更改並不能修改到緩存了的返回值。可是在finally中寫return是能夠返回成功的。 20 try-with-resource只是JDK實現了一個語法糖,本質上仍是try-catch-finally 21 聲明異常 22 throws 在方法(類)的聲明處聲明可能要拋出的異常 23 當一個方法產生一個它不處理的異常時,那麼就須要在該方法的頭部聲明這個異常,以便將該異常傳遞到方法的外部進行處理。 24 子類在覆蓋父類帶 throws 子句的方法時,子類的方法聲明中的 throws 子句不能出現父類對應方法的 throws 子句中沒有的異常類型, 25 子類方法拋出的異常不會超過父類定義的範圍。 26 拋出異常 27 throw 在方法(類)內部手動拋出一個具體的異常類型。 28 throw 須要用戶本身捕獲相關的異常,然後再對其進行相關包裝,最後將包裝後的異常信息拋出。 29 throws vs throw 30 throws 用來聲明一個方法可能拋出的全部異常信息 31 throw 則是指拋出的一個具體的異常類型。 32 方法(類)聲明處 經過 throws 聲明方法(類)可能拋出的異常信息, 33 方法(類)內部 經過 throw 拋出一個具體的異常信息。 34 throws 一般不用顯示地捕獲異常,可由系統自動將全部捕獲的異常信息拋給上級方法; 35 throw 則須要用戶本身捕獲相關的異常,然後再對其進行相關包裝,最後將包裝後的異常信息拋出。
出現運行時異常後,系統會把異常一直往上層拋,一直遇處處理代碼。若是沒有處理塊,到最上層,若是是多線程就由 Thread.run()拋出 ,若是是單線程就被 main() 拋出 。拋出以後,若是是線程,這個線程也就退出了。若是是主程序拋出的異常,那麼這整個程序也就退出了。運行時異常是 Exception 的子類,也有通常異常的特色,是能夠被 Catch 塊處理的。只不過每每咱們不對他處理罷了。也就是說,你若是不對運行時異常進行處理,那麼出現運行時異常以後,要麼是線程停止,要麼是主程序終止。
若是不想終止,則必須撲捉全部的運行時異常,決不讓這個處理線程退出。隊列裏面出現異常數據了,正常的處理應該是把異常數據捨棄,而後記錄日誌。不該該因爲異常數據而影響下面對正常數據的處理。 在這個場景這樣處理多是一個比較好的應用,但並不表明在全部的場景你都應該如此。若是在其它場景,遇到了一些錯誤,若是退出程序比較好,這時你就能夠不太理會運行時異常 ,或者是經過對異常的處理顯式的控制程序退出。