今天遇到了這樣一段代碼,代碼中有一個try catch,可是奇怪的是try括起來的代碼中的方法調用都不會拋異常,這是什麼狀況呢?java
首先,咱們所說的「不會拋異常」,是指調用的方法簽名中並無throw exception。也就是說調用方法不會拋出checked exception。那麼還有一種可能就是這個方法可能會拋出runtime exception。函數
因而第一個問題是:咱們知道runtime exception能夠被JVM捕獲,runtime exception也能夠被try catch捕獲嗎?編碼
因而寫了一個小例子驗證了一下:spa
try{ throw new RuntimeException(); } catch (Exception ex) { System.out.println("runtime exception can be catched by try catch block.") }
結果是:啊!原來runtime exception是能夠被try catch捕獲到的呀!!設計
第二個問題:這種用try catch捕獲runtime exception的代碼貌似不常見吧(雖然我也沒有見過太多代碼),爲何呢?code
那麼什麼是runtime exception,通過查了一些資料,個人理解是這樣的:blog
首先java程序運行中的問題,會分爲exception和error兩種。其中error是指沒法恢復的嚴重狀況,好比以前用c語言時常見的stackoverflow等內存不夠用的錯誤。對於exception而言,又能夠分爲checked exception和unchecked exception。內存
我的理解,概念的分類(好比上面的兩次分類)都是由於當時定義概念的時候是相對而言的,也就是存在一個度,在這個度的左邊,就是error,在右邊,就是exception。對於checked exception和runtime exception也是同樣的。因此,咱們要理解runtime exception就要先理解什麼叫作checked exception。編譯器
checked exception,使用「顧名思義」這種最簡單的理解方式,他指的是java編譯器所可以識別(check)出來的exception。那麼編譯器是沒有那麼聰明的,他的作法猜想就是看到某個地方有throw exception這樣的動做,就必須在調用層中要麼發現throw exception,要麼發現catch到該exception。固然,對於checked exception,也能夠一直throw,知道throw出main函數被JVM捕獲。從這個角度理解,checked exception指的就是用throw語句顯式拋出的異常。也就是寫API的人預想到某種狀況下,可能會出問題,而且這個問題值得被處理,那麼就會在某個if分支下拋出異常,而後也就創造出了一個checked exception。博客
插播一句話,不對編譯錯誤顯示紅色的IDE不是好IDE。
那麼相對而言,runtime exception就不同了,寫API的人沒有將可能發生runtime exception的狀況用if寫下來而且throw exception。緣由可能有多種,好比對於常見的runtime exception,對於NullPointerException和ArrayIndexOutOfBoundException,這種錯誤都是programmer能夠經過嚴格的編碼來避免的。所以也就是不值得API的設計人員專門寫一個if分支來處理這種問題。對於runtime exception的處理,能夠經過try catch來處理,也能夠不作處理,直接交給JVM。
好像內容有點淺,先把博客放在這裏,之後有了其餘認識再來更新吧。