Error類和Exception類都繼承自Throwable類。java
java.lang.Object
java.lang.Throwable
java.lang.Error程序員
java.lang.Object
java.lang.Throwable
java.lang.Exception數據庫
兩者的不一樣之處:數組
Exception:
1.能夠是可被控制(checked) 或不可控制的(unchecked)
unchecked:NullPointerException、ClassCastException和IndexOutOfBoundsException都是RuntimeException的子類,RuntimeException及其全部的子集一般都是unchecked的。
2.表示一個由程序員致使的錯誤
3.應該在應用程序級被處理安全
Error:
1.老是不可控制的(unchecked)
2.常常用來用於表示系統錯誤或低層資源的錯誤
3.如何可能的話,應該在系統級被捕捉服務器
Java 中定義了兩類異常: app
1) Checked exception: 這類異常都是Exception的子類 。異常的向上拋出機制進行處理,假如子類可能產生A異常,那麼在父類中也必須throws A異常。可能致使的問題:代碼效率低,耦合度太高。
2) Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException一樣也是Exception的子類,可是它們是非凡的,它們 不能經過client code來試圖解決,因此稱爲Unchecked exception 。this
Java 中異常類的繼承關係圖:spa
即RuntimeException(運行時異常)
不須要try...catch...或throws 機制去處理的異常
操作系統
這是JAVA認證考試中最多見的題目,事實上,runtime exception中最多見的,常常碰到的,也就5,6種,以下:
ArithmeticException | int a=0; int b= 3/a; |
ClassCastException: | Object x = new Integer(0); System.out.println((String)x); |
IndexOutOfBoundsException ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException |
int [] numbers = { 1, 2, 3 }; int sum = numbers[3]; |
IllegalArgumentException NumberFormatException |
int a = Interger.parseInt("test"); |
NullPointerExceptionextends |
下面是JDK API中列出的異常類:
除了RuntimeException之外的,都是checked Exception
java.lang.Object
java.lang.Throwable java.lang.Exception 全部已實現的接口: Serializable 直接已知子類: AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException, BackingStoreException, BadAttributeValueExpException, BadBinaryOpValueExpException, BadLocationException, BadStringOperationException, BrokenBarrierException, CertificateException, ClassNotFoundException, CloneNotSupportedException, DataFormatException, DatatypeConfigurationException, DestroyFailedException, ExecutionException, ExpandVetoException, FontFormatException, GeneralSecurityException, GSSException, IllegalAccessException, IllegalClassFormatException, InstantiationException, InterruptedException, IntrospectionException, InvalidApplicationException, InvalidMidiDataException, InvalidPreferencesFormatException, InvalidTargetObjectTypeException, InvocationTargetException, IOException, JAXBException, JMException, KeySelectorException, LastOwnerException, LineUnavailableException, MarshalException, MidiUnavailableException, MimeTypeParseException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NoSuchFieldException, NoSuchMethodException, NotBoundException, NotOwnerException, ParseException, ParserConfigurationException, PrinterException, PrintException, PrivilegedActionException, PropertyVetoException, RefreshFailedException, RemarshalException, RuntimeException, SAXException, ScriptException, ServerNotActiveException, SOAPException, SQLException, TimeoutException, TooManyListenersException, TransformerException, TransformException, UnmodifiableClassException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URIReferenceException, URISyntaxException, UserException, XAException, XMLParseException, XMLSignatureException, XMLStreamException, XPathException |
算術異常類: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
類型不存在異常。
1,「簡要的敘述error和exception」)。就像Mary Campione的「The Java Tutorial」中所寫的:「exception就是在程序執行中所發生的中斷了正常指令流的事件(An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions.)。」依照美國傳統辭典(American Heritage Dictionary)所解釋的,error就是:「效果或狀況背離了可接受的通常法則(The act or an instance of deviating from an accepted code of behavior.)」
背離(deviation)、中斷(disruption),有什麼區別呢?讓咱們來這樣想:若是你驅車在公路上行駛時有人攔住了你,這就叫作「中斷」。若是車根本就沒法發動,那就叫作「背離」。
這與Java有什麼關係呢?不少。Java中有一個至關有趣的error和exception的結構。
是的,很是正確:全部使用try{} catch(Exception e){}的代碼塊只能找到你一半的錯誤。可是,是否try並catch Throwable取決於你捕捉它的緣由。快速的看一下Error的子類,它們的名字相似VirtualMachineError,ThreadDeath,LinkageError。當你想捕獲這些傢伙們的時候,你要肯定你須要捕獲它們。由於那些都是很嚴重的錯誤。
可是ClassCastException是一個error嗎?不徹底是。ClassCastException或任何類型的exception只是虛擬機(VM,VirtualMachine)讓你知道有問題發生的方式,這說明,開發者產生了一個錯誤,如今有一個機會去修正它。
另外一方面,error是虛擬機的問題(一般是這樣,但也多是操做系統的問題)。引用Java文檔中關於error的說明:「Error是Throwable的子類,它的出現說明出現了嚴重的問題。通常應用程序除非有理由,不然不該該捕捉Error。一般這是很是反常的狀況。」
因此,error很是強大,並且但處理它遠比通常開發者想象的要難(固然不是你)。若是你在作一項很簡單的工做的話,你認爲有必要去處理error?
首先,記住,error跟exception拋出的方式大致相同的,只有一點不一樣。就是一個拋出error的方法不須要對此進行聲明(換句話說,這是一個unchecked exception(也被稱作Runtime Exception))。
public void myFirstMethod() throws Exception
//Since it's an exception, I have to declare
//it in the throws clause {
throw new Exception();
}
public void mySecondMethod()
//Because errors aren't supposed to occur, you
//don't have to declare them.
{
throw new Error();
}
注意,有一些exception是不可控制的(unchecked exception),跟error的表現是同樣的,如:NullPointerException,ClassCastException和IndexOutOfBoundsException,它們都是RuntimeException的子類。RuntimeException和其子類都是unchecked excception。
那應該如何處理這些使人討厭的unchecked exception呢?你能夠在可能出現問題的地方catch它們,但這只是一個不完整的解決方法。這樣雖然解決了一個問題,但其他的代碼仍可能被其餘unchecked exception所中斷。這裏有一個更好的辦法,感謝ThreadGroup類提供了這個很棒的方法:
public class ApplicationLoader extends ThreadGroup
{
private ApplicationLoader()
{
super("ApplicationLoader");
}
public static void main(String[] args)
{
Runnable appStarter = new Runnable()
{
public void run()
{
//invoke your application
(i.e. MySystem.main(args)
}
}
new Thread(new ApplicationLoader(), appStarter).start();
}
//We overload this method from our parent
//ThreadGroup , which will make sure that it
//gets called when it needs to be. This is
//where the magic occurs.
public void uncaughtException(Thread thread, Throwable exception)
{
//Handle the error/exception.
//Typical operations might be displaying a
//useful dialog, writing to an event log, etc.
}
這個技巧太棒了。想一想這種狀況,你對你的GUI程序進行了修改,而後一個unchecked exception被拋出了。而且你的GUI程序經常具備了錯誤的狀態(對話框仍舊開着,按鈕失效了,光標狀態出現錯誤)。可是,使用這個技巧,你能夠將你的GUI程序恢復原始狀態並通知用戶出現了錯誤。對本身感受很棒吧,由於你寫了一個高質量的應用程序。
這個技巧並不僅適用於GUI程序。服務器端應用程序可使用這個技巧來釋放資源,防止虛擬機進入不穩定狀態。較早的捕獲錯誤並聰明的將其處理是好的程序員和普通程序員的區別之一。你已經明白了這些,我知道你想成爲哪一類程序員。
關於做者
Josh Street是Bank of America的構架設計師。他主要負責電子商務平臺的開發。他的聯繫方式是rjstreet@computer.org。
附1
簡要的敘述error和exception
Error和Exception都繼承自Throwable,他們下列不一樣處:
Exceptions
1.能夠是 可被控制(checked) 或 不可控制的(unchecked)
2.表示一個由程序員致使的錯誤
3.應該在應用程序級被處理
Errors
1.老是 不可控制的(unchecked)
2.常常用來用於表示系統錯誤或低層資源的錯誤
3.如何可能的話,應該在系統級被捕捉