1、基本概念java
Throwable是全部異常的根,java.lang.Throwable
Error是錯誤,java.lang.Error
Exception是異常,java.lang.Exception數組
Throwable: 有兩個重要的子類:Exception(異常)和 Error(錯誤),兩者都是 Java 異常處理的重要子類,各自都包含大量子類。測試
Error(錯誤):是程序沒法處理的錯誤,表示運行應用程序中較嚴重問題。大多數錯誤與代碼編寫者執行的操做無關,而表示代碼運行時 JVM(Java 虛擬機)出現的問題。例如,Java虛擬機運行錯誤(Virtual MachineError),當 JVM 再也不有繼續執行操做所需的內存資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機(JVM)通常會選擇線程終止。spa
這些錯誤表示故障發生於虛擬機自身、或者發生在虛擬機試圖執行應用時,如Java虛擬機運行錯誤(Virtual MachineError)、類定義錯誤(NoClassDefFoundError)等。這些錯誤是不可查的,由於它們在應用程序的控制和處理能力之 外,並且絕大多數是程序運行時不容許出現的情況。對於設計合理的應用程序來講,即便確實發生了錯誤,本質上也不該該試圖去處理它所引發的異常情況。在 Java中,錯誤經過Error的子類描述。線程
Exception(異常):是程序自己能夠處理的異常。設計
Exception 類有一個重要的子類 RuntimeException。RuntimeException 類及其子類表示「JVM 經常使用操做」引起的錯誤。例如,若試圖使用空值對象引用、除數爲零或數組越界,則分別引起運行時異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。code
注意:異常和錯誤的區別:異常能被程序自己能夠處理,錯誤是沒法處理。對象
2、Exceptionblog
通常分爲Checked異常和Runtime異常,全部RuntimeException類及其子類的實例被稱爲Runtime異常,不屬於該範疇的異常則被稱爲CheckedException。內存
①Checked異常
只有java語言提供了Checked異常,Java認爲Checked異常都是能夠被處理的異常,因此Java程序必須顯示處理Checked異常。若是程序沒有處理Checked異常,該程序在編譯時就會發生錯誤沒法編譯。這體現了Java的設計哲學:沒有完善錯誤處理的代碼根本沒有機會被執行。對Checked異常處理方法有兩種
1 當前方法知道如何處理該異常,則用try...catch塊來處理該異常。
2 當前方法不知道如何處理,則在定義該方法是聲明拋出該異常。
1 package cn.xy.test; 2 3 import java.io.IOException; 4 5 /** 6 * Checked異常測試方法 7 * @author xy 8 * 9 */ 10 public class CheckedExceptionMethods 11 { 12 // 總異常類,既有checkedException又有RuntimeException,因此其中的checkedException必須處理 13 public void method1() throws Exception 14 { 15 System.out.println("我是拋出異常總類的方法"); 16 } 17 18 // 捕獲並處理這個異常 19 public void testMethod1_01() 20 { 21 try 22 { 23 method1(); 24 } 25 catch (Exception e) 26 { 27 e.printStackTrace(); 28 } 29 } 30 31 // 把異常傳遞下去 32 public void testMethod1_02() throws Exception 33 { 34 method1(); 35 } 36 37 public void testMethod1_03() throws Exception 38 { 39 throw new Exception(); 40 } 41 42 public void testMethod1_04() 43 { 44 try 45 { 46 throw new Exception(); 47 } 48 catch (Exception e) 49 { 50 e.printStackTrace(); 51 } 52 } 53 54 // checkedException典型表明IOException 55 public void method2() throws IOException 56 { 57 System.out.println("我是拋出IO異常的方法"); 58 } 59 60 public void testMethod2_01() 61 { 62 try 63 { 64 method2(); 65 } 66 catch (Exception e) 67 { 68 e.printStackTrace(); 69 } 70 } 71 72 public void testMethod2_02() throws Exception 73 { 74 method2(); 75 } 76 77 }
咱們比較熟悉的Checked異常有
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
②RuntimeException
Runtime如除數是0和數組下標越界等,其產生頻繁,處理麻煩,若顯示申明或者捕獲將會對程序的可讀性和運行效率影響很大。因此由系統自動檢測並將它們交給缺省的異常處理程序。固然若是你有處理要求也能夠顯示捕獲它們。
1 package cn.xy.test; 2 3 /** 4 * 運行時異常測試方法 5 * @author xy 6 * 7 */ 8 public class RuntimeExcetionMethods 9 { 10 public void method3() throws RuntimeException 11 { 12 System.out.println("我是拋出運行時異常的方法"); 13 } 14 15 public void testMethod3_01() 16 { 17 method3(); 18 } 19 20 public void testMethod1_02() 21 { 22 throw new RuntimeException(); 23 } 24 }
咱們比較熟悉的RumtimeException類的子類有
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
3、Error
當程序發生不可控的錯誤時,一般作法是通知用戶並停止程序的執行。與異常不一樣的是Error及其子類的對象不該被拋出。
Error是throwable的子類,表明編譯時間和系統錯誤,用於指示合理的應用程序不該該試圖捕獲的嚴重問題。
Error由Java虛擬機生成並拋出,包括動態連接失敗,虛擬機錯誤等。程序對其不作處理。