本文主要內容:Java中RuntimeException分析,以及運行時異常和異常的對比。java
異常機制是指當程序出現錯誤後,程序如何處理。 當異常拋出後,會發生如下幾件事:編程
public static int parseInt(String s, int radix)throws NumberFormatException{ if (s == null) { throw new NumberFormatException("null"); } ... } public static void main(String[] args){ String s=null; Integer.parseInt(s); System.out.println("**********end**********"); }
若是執行以上代碼,程序會打印如下內容:指針
Exception in thread "main" java.lang.NumberFormatException: null at java.lang.Integer.parseInt(Integer.java:454) at java.lang.Integer.parseInt(Integer.java:527) at com.test.exception.TestException.main(TestException.java:14)
咱們並未對這個異常作任何處理,控制檯的東西並非咱們打印的,並且這些內容通常是在調用了printStackTrace()方法以後纔會打印到控制檯的,這就說明JVM拋出了這個異常。而且把它打印到了控制檯。code
固然咱們也能夠本身去處理這個異常,處理異常的結果是程序雖然出錯了,可是還能往下執行。orm
public static void main(String[] args) { try { String s = null; Integer.parseInt(s); System.out.println("**********start**********"); } catch (Exception e) { e.printStackTrace(System.out); } System.out.println("**********end**********"); } // 輸出如下內容 java.lang.NumberFormatException: null at java.lang.Integer.parseInt(Integer.java:454) at java.lang.Integer.parseInt(Integer.java:527) at com.test.exception.TestException.main(TestException.java:13) *********************end*********************
Exception e 這個參數能夠接收到程序拋出的異常對象。 爲了區別於JVM自行處理的異常,咱們接受到異常的對象以後,把輸出重定向到系統的標準輸出中。而且程序還在往下執行。可是像這類異常,咱們通常不會手動去捕獲。對象
經過上面的案例,能夠發現,雖然 parseInt()這個方法可能拋出異常,可是不用try-catch也能直接調用這個方法。 再看一個案例:繼承
// 編譯通不過 File file = new File("d:/file.txt"); InputStream inputStream = new FileInputStream(file); //源碼 public FileInputStream(File file) throws FileNotFoundException { ... if (file.isInvalid()) { throw new FileNotFoundException("Invalid file path"); } }
FileInputStream 的源碼中也可能會拋出異常,可是若是在外層不加上try-catch編譯就會通不過。這就說明這個異常是須要咱們自行去處理的。input
Exception RuntimeException IllegalArgumentException NumberFormatException Exception IOException FileNotFoundException
緣由就在於NumberFormatException繼承了RuntimeException,繼承自RuntimeException的異常一般被稱爲不受檢查的異常。 如下是jdk源碼中對RuntimeException的說明:編譯器
* {@code RuntimeException} is the superclass of those * exceptions that can be thrown during the normal operation of the * Java Virtual Machine. RuntimeException是在Java虛擬機正常運行期間能夠拋出的那些異常的超類。
RuntimeException這種異常屬於錯誤,將會被自動捕獲。因此在調用parseInt()方法時不須要加上try-catch,而其餘類型的異常的處理都是由編譯器強制實施的,例如使用FileInputStream若是不處理異常,編譯就通不過。究其緣由,RuntimeException屬於編程錯誤,好比從控制範圍以外傳遞進來的null引用,典型的NullPointerException空指針異常就繼承自RuntimeException,屬於運行時的異常。源碼