Java中RuntimeException分析

本文主要內容:Java中RuntimeException分析,以及運行時異常和異常的對比。java


拋一個異常發生了什麼?

異常機制是指當程序出現錯誤後,程序如何處理。 當異常拋出後,會發生如下幾件事:編程

  1. 首先,同Java中建立其餘對象同樣,將使用new在堆上建立異常對象。
  2. 而後,當前的執行路徑被終止,而且從當前環境中彈出對異常對象的引用,此時,異常處理機制接管程序。 並開始尋找一個恰當的地方來繼續執行程序。 例如,在parseInt的源碼中,若是s爲空,會拋出一個NumberFormatException異常。
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,屬於運行時的異常。源碼

相關文章
相關標籤/搜索