java.lang.Excetion,java.lang.RuntimeException,java.lang.Error有什么區別?


 Error類對象由Java虛擬機生成並拋出,Exception類對象由應用程序處理或拋出
 Error表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。
 Error表示系統級的錯誤和程序不必處理的異常。
 RuntimeException 是屬於unchecked (java 編譯器允許不catch)表示一類 未知的不確定的只有在運行時才會出現的異常。
 Exception 是checked (java 編譯器必須要求 catch),大概指一類可以預知的,當發生異常后知道如何處理的異常,所以需要捕獲。  之所以區分 checked/unchecked exception,JAVA的設計思想是區分從類/方法設計者角度來看兩種不同的異常: 
一種是設計者認為這個方法在使用過程中使用者能夠處理的異常,這些往往作為checked exception。比如一個IO系統的設計者會認為諸如物理文件不存在或者介質無法讀取等異常時很可能發生,而使用者完全可能捕獲這個異常,通過讓用戶 重新輸入文件名等方式重新進行這個操作,也就是說,這是一個可恢復的操作。所以我會在諸如 read()/write()等操作中throw 一個 IOException(checked exception)。 
第二種是設計者認為使用者不能夠處理的異常,比如我寫一個函數要求傳入的參數是個正數,那么當我發現使用者傳 了個負數進來時,合理的預期是程序中出bug了。如果我拋出一個異常描述這件事,即使我要求調用者捕獲這個異常,他肯定也不知道該怎么辦(總不能隨便傳一 個正數進來吧)。這時候我就會拋出一個IllegalArgumentException(uncheck exception),這里面的潛台詞是:小子,我知道你也是幫人背黑鍋的,處理不了這個,你還是交給你的領導(調用你的程序)去處理這個異常吧。 
同理,當JVM發現除數為0時,拋出的ArithmeticException也是一個unchecked exception。

從這里可以看出,checked exception和 unchecked exception的根本區別在於設計者認為使用者是否能夠並且應該處理這個異常。不幸的是,由於Java使用者水平的參差不齊,大量的 unchecked exception該被設計成了checked exception,而對於真正的checked exception,又有太多被catch了之后啥都不作就悄無聲息了。尤其是不聲不響吞噬exception的行為,不但達不到設計者本來的要求(進行 恢復處理),甚至問題更大(連 unchecked exception那種最后報錯的效果都沒了)。 

 
        

 
        

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.Exception
根異常。用以描述應用程序希望捕獲的情況。

java.lang.ClassNotFoundException
找不到類異常。當應用試圖根據字符串形式的類名構造類,而在遍歷CLASSPAH之后找不到對應名稱的class文件時,拋出該異常

java.lang.IllegalAccessException

當應用程序試圖反射性地創建一個實例(而不是數組)、設置或獲取一個字段,或者調用一個方法,但當前正在執行的方法無法訪問指定類、字段、方法或構造方法的定義時,拋出 IllegalAccessException


java.lang.IOException
當發生某種 I/O 異常時,拋出此異常。此類是失敗或中斷的 I/O 操作生成的異常的通用類。

java.lang.SQLException
提供關於數據庫訪問錯誤或其他錯誤信息的異常。
--------------------------------------------------------------------------------------------------------------------------------------------
java.lang.RuntimeException
運行時異常。是所有Java虛擬機正常操作期間可以被拋出的異常的父類。

java.lang.ClassCastException
當試圖將對象強制轉換為不是實例的子類時,拋出該異常。 

java.lang.IllegalArgumentException
拋出的異常表明向方法傳遞了一個不合法或不正確的參數。

java.lang.IndexOutOfBoundsException
指示某排序索引(例如對數組、字符串或向量的排序)超出范圍時拋出。

java.lang.NullPointerException
當應用程序試圖在需要對象的地方使用 null 時,拋出該異常。
-----------------------------------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM