異常就是在程序的運行過程當中所發生的不正常的事件,它會中斷正在運行的程序。html
異常不是錯誤java
程序中關鍵的位置有異常處理,提升程序的穩定性程序員
Java的異常處理是經過5個關鍵字來實現的數據庫
try:嘗試,把有可能發生錯誤的代碼放在其中,必須有數組
catch:捕獲,當發生異常時執行安全
finally:最終,不論是否有異常都將執行app
throw:拋出,引起異常jsp
throws:拋出多個,聲明方法將產生某些異常ide
Java標準庫內建了一些通用的異常,這些類以Throwable爲頂層父類。函數
Throwable又派生出Error類和Exception類。
錯誤:Error類以及他的子類的實例,表明了JVM自己的錯誤。錯誤不能被程序員經過代碼處理,Error不多出現。所以,程序員應該關注Exception爲父類的分支下的各類異常類。
異常:Exception以及他的子類,表明程序運行時發送的各類不指望發生的事件。能夠被Java異常處理機制使用,是異常處理的核心。
算術異常類:ArithmeticExecption 空指針異常類:NullPointerException 類型強制轉換異常:ClassCastException 數組負下標異常:NegativeArrayException 數組下標越界異常:ArrayIndexOutOfBoundsException 違背安全原則異常:SecturityException 文件已結束異常:EOFException 文件未找到異常:FileNotFoundException 字符串轉換爲數字異常:NumberFormatException 操做數據庫異常:SQLException 輸入輸出異常:IOException 方法未找到異常:NoSuchMethodException java.lang.AbstractMethodError 抽象方法錯誤。當應用試圖調用抽象方法時拋出。 java.lang.AssertionError 斷言錯。用來指示一個斷言失敗的狀況。 java.lang.ClassCircularityError 類循環依賴錯誤。在初始化一個類時,若檢測到類之間循環依賴則拋出該異常。 java.lang.ClassFormatError 類格式錯誤。當Java虛擬機試圖從一個文件中讀取Java類,而檢測到該文件的內容不符合類的有效格式時拋出。 java.lang.Error 錯誤。是全部錯誤的基類,用於標識嚴重的程序運行問題。這些問題一般描述一些不該被應用程序捕獲的反常狀況。 java.lang.ExceptionInInitializerError 初始化程序錯誤。當執行一個類的靜態初始化程序的過程當中,發生了異常時拋出。靜態初始化程序是指直接包含於類中的static語句段。 java.lang.IllegalAccessError 違法訪問錯誤。當一個應用試圖訪問、修改某個類的域(Field)或者調用其方法,可是又違反域或方法的可見性聲明,則拋出該異常。 java.lang.IncompatibleClassChangeError 不兼容的類變化錯誤。當正在執行的方法所依賴的類定義發生了不兼容的改變時,拋出該異常。通常在修改了應用中的某些類的聲明定義而沒有對整個應用從新編譯而直接運行的狀況下,容易引起該錯誤。 java.lang.InstantiationError 實例化錯誤。當一個應用試圖經過Java的new操做符構造一個抽象類或者接口時拋出該異常. java.lang.InternalError 內部錯誤。用於指示Java虛擬機發生了內部錯誤。 java.lang.LinkageError 連接錯誤。該錯誤及其全部子類指示某個類依賴於另一些類,在該類編譯以後,被依賴的類改變了其類定義而沒有從新編譯全部的類,進而引起錯誤的狀況。 java.lang.NoClassDefFoundError 未找到類定義錯誤。當Java虛擬機或者類裝載器試圖實例化某個類,而找不到該類的定義時拋出該錯誤。 java.lang.NoSuchFieldError 域不存在錯誤。當應用試圖訪問或者修改某類的某個域,而該類的定義中沒有該域的定義時拋出該錯誤。 java.lang.NoSuchMethodError 方法不存在錯誤。當應用試圖調用某類的某個方法,而該類的定義中沒有該方法的定義時拋出該錯誤。 java.lang.OutOfMemoryError 內存不足錯誤。當可用內存不足以讓Java虛擬機分配給一個對象時拋出該錯誤。 java.lang.StackOverflowError 堆棧溢出錯誤。當一個應用遞歸調用的層次太深而致使堆棧溢出時拋出該錯誤。 java.lang.ThreadDeath 線程結束。當調用Thread類的stop方法時拋出該錯誤,用於指示線程結束。 java.lang.UnknownError 未知錯誤。用於指示Java虛擬機發生了未知嚴重錯誤的狀況。 java.lang.UnsatisfiedLinkError 未知足的連接錯誤。當Java虛擬機未找到某個類的聲明爲native方法的本機語言定義時拋出。 java.lang.UnsupportedClassVersionError 不支持的類版本錯誤。當Java虛擬機試圖從讀取某個類文件,可是發現該文件的主、次版本號不被當前Java虛擬機支持的時候,拋出該錯誤。 java.lang.VerifyError 驗證錯誤。當驗證器檢測到某個類文件中存在內部不兼容或者安全問題時拋出該錯誤。 java.lang.VirtualMachineError 虛擬機錯誤。用於指示虛擬機被破壞或者繼續執行操做所需的資源不足的狀況。 java.lang.ArithmeticException 算術條件異常。譬如:整數除零等。 java.lang.ArrayIndexOutOfBoundsException 數組索引越界異常。當對數組的索引值爲負數或大於等於數組大小時拋出。 java.lang.ArrayStoreException 數組存儲異常。當向數組中存放非數組聲明類型對象時拋出。 java.lang.ClassCastException 類造型異常。假設有類A和B(A不是B的父類或子類),O是A的實例,那麼當強制將O構造爲類B的實例時拋出該異常。該異常常常被稱爲強制類型轉換異常。 java.lang.ClassNotFoundException 找不到類異常。當應用試圖根據字符串形式的類名構造類,而在遍歷CLASSPAH以後找不到對應名稱的class文件時,拋出該異常。 java.lang.CloneNotSupportedException 不支持克隆異常。當沒有實現Cloneable接口或者不支持克隆方法時,調用其clone()方法則拋出該異常。 java.lang.EnumConstantNotPresentException 枚舉常量不存在異常。當應用試圖經過名稱和枚舉類型訪問一個枚舉對象,但該枚舉對象並不包含常量時,拋出該異常。 java.lang.Exception 根異常。用以描述應用程序但願捕獲的狀況。 java.lang.IllegalAccessException 違法的訪問異常。當應用試圖經過反射方式建立某個類的實例、訪問該類屬性、調用該類方法,而當時又沒法訪問類的、屬性的、方法的或構造方法的定義時拋出該異常。 java.lang.IllegalMonitorStateException 違法的監控狀態異常。當某個線程試圖等待一個本身並不擁有的對象(O)的監控器或者通知其餘線程等待該對象(O)的監控器時,拋出該異常。 java.lang.IllegalStateException 違法的狀態異常。當在Java環境和應用還沒有處於某個方法的合法調用狀態,而調用了該方法時,拋出該異常。 java.lang.IllegalThreadStateException 違法的線程狀態異常。當縣城還沒有處於某個方法的合法調用狀態,而調用了該方法時,拋出異常。 java.lang.IndexOutOfBoundsException 索引越界異常。當訪問某個序列的索引值小於0或大於等於序列大小時,拋出該異常。 java.lang.InstantiationException 實例化異常。當試圖經過newInstance()方法建立某個類的實例,而該類是一個抽象類或接口時,拋出該異常。 java.lang.InterruptedException 被停止異常。當某個線程處於長時間的等待、休眠或其餘暫停狀態,而此時其餘的線程經過Thread的interrupt方法終止該線程時拋出該異常。 java.lang.NegativeArraySizeException 數組大小爲負值異常。當使用負數大小值建立數組時拋出該異常。 java.lang.NoSuchFieldException 屬性不存在異常。當訪問某個類的不存在的屬性時拋出該異常。 java.lang.NoSuchMethodException 方法不存在異常。當訪問某個類的不存在的方法時拋出該異常。 java.lang.NullPointerException 空指針異常。當應用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出null等等。 java.lang.NumberFormatException 數字格式異常。當試圖將一個String轉換爲指定的數字類型,而該字符串確不知足數字類型要求的格式時,拋出該異常。 java.lang.RuntimeException 運行時異常。是全部Java虛擬機正常操做期間能夠被拋出的異常的父類。 java.lang.SecurityException 安全異常。由安全管理器拋出,用於指示違反安全狀況的異常。 java.lang.StringIndexOutOfBoundsException 字符串索引越界異常。當使用索引值訪問某個字符串中的字符,而該索引值小於0或大於等於序列大小時,拋出該異常。 java.lang.TypeNotPresentException 類型不存在異常。當應用試圖以某個類型名稱的字符串表達方式訪問該類型,可是根據給定的名稱又找不到該類型是拋出該異常。該異常與ClassNotFoundException的區別在於該異常是unchecked(不被檢查)異常,而ClassNotFoundException是checked(被檢查)異常。 java.lang.UnsupportedOperationException 不支持的方法異常。指明請求的方法不被支持狀況的異常。 異常 javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action名字) 可能緣由 action沒有再struts-config.xml 中定義,或沒有找到匹配的action,例如在JSP文件中使用 <html:form action="Login.do".將表單提交給Login.do處理,若是出現上述異常,請查看struts-config.xml中的定義部分,有時多是打錯了字符或者是某些不符合規則,可使用strutsconsole工具來檢查。
非檢查異常(unckecked exception):Error 和 RuntimeException 以及他們的子類。javac在編譯時,不會提示和發現這樣的異常,不要求在程序處理這些異常。因此若是願意,咱們能夠編寫代碼處理(使用try…catch…finally)這樣的異常,也能夠不處理。對於這些異常,咱們應該修正代碼,而不是去經過異常處理器處理 。這樣的異常發生的緣由多半是代碼寫的有問題。如除0錯誤ArithmeticException,錯誤的強制類型轉換錯誤ClassCastException,數組索引越界ArrayIndexOutOfBoundsException,使用了空對象NullPointerException等等。
檢查異常(checked exception):除了Error 和 RuntimeException的其它異常。javac強制要求程序員爲這樣的異常作預備處理工做(使用try…catch…finally或者throws)。在方法中要麼用try-catch語句捕獲它並處理,要麼用throws子句聲明拋出它,不然編譯不會經過。這樣的異常通常是由程序的運行環境致使的。由於程序可能被運行在各類未知的環境下,而程序員沒法干預用戶如何使用他編寫的程序,因而程序員就應該爲這樣的異常時刻準備着。如SQLException , IOException,ClassNotFoundException 等。
須要明確的是:檢查和非檢查是對於javac來講的,這樣就很好理解和區分了。
throws聲明:若是一個方法內部的代碼會拋出檢查異常(checked exception),而方法本身又沒有徹底處理掉,則javac保證你必須在方法的簽名上使用throws關鍵字聲明這些可能拋出的異常,不然編譯不經過。
throws是另外一種處理異常的方式,它不一樣於try…catch…finally,throws僅僅是將函數中可能出現的異常向調用者聲明,而本身則不具體處理。
採起這種異常處理的緣由多是:方法自己不知道如何處理這樣的異常,或者說讓調用者處理更好,調用者須要爲可能發生的異常負責。
最簡單的判斷點有兩個:
1.繼承自RuntimeException或Error的是非檢查型異常,而繼承自Exception的則是檢查型異常(固然,RuntimeException自己也是Exception的子類)。
2.對非檢查型類異常能夠不用捕獲,而檢查型異常則必須用try語句塊進行處理或者把異常交給上級方法處理總之就是必須寫代碼處理它。
Java 的異常結構以下圖。其中直接繼承Exception的異常,必須捕獲,屬於檢查型異常。
//運行期異常 throw new RuntimeException("不須要聲明異常"); //檢查時異常 throw new Exception("須要聲明異常");
一、運行時異常
運行異常的特色是Java編譯器不去檢查它,也就是說,當程序中可能出現這類異常時,即便沒有用try...catch語句捕獲它,也沒有用throws字句聲明拋出它,仍是會編譯經過。
二、受檢查異常
除了運行異常外,其餘異常都屬於受檢查異常,這種異常的特色是要麼用try...catch捕獲處理,要麼用throws語句聲明拋出,不然編譯不會經過。
三、二者的區別
運行異常表示沒法讓程序恢復運行的異常,致使這種異常的緣由一般是因爲執行了錯誤的操做。一旦出現錯誤,建議讓程序終止