天天看點

異常處理—錯誤抛出機制

錯誤抛出機制:

  把可能出現異常的代碼寫在try{}裡,使用catch(){}設定一些異常陷阱來捕獲異常。例如:

<a href="https://s1.51cto.com/oss/201710/19/9aecdbf4dd8669418112366edb766c1f.png" target="_blank"></a>

<a href="https://s3.51cto.com/oss/201710/19/134ad99a888a4c4155b9b420ed127642.png" target="_blank"></a>

沒有異常處理時異常的抛出機制:

  為什麼出現異常會在控制台上顯示列印紅色的異常呢?這是因為其實main方法外面還有一個try catch,try包圍住main方法,catch捕捉異常,是以在main方法裡沒有寫try catch來捕獲出現的異常,這個異常就會往外抛到包圍main方法的這個try catch,然後就會在控制台上列印出現的異常。

<a href="https://s1.51cto.com/oss/201710/19/e0be4e5f1ef3d195d34a6853b813229c.png" target="_blank"></a>

異常抛出機制過程:

<a href="https://s1.51cto.com/oss/201710/19/a00ccf709c066e7707c34364cc9ba2d6.png" target="_blank"></a>

異常家族:

  Thrwable是所有異常類的最高父類,它的兩個子類Error(虛拟機報的異常)和Exception(代碼上報出的異常),隻要是繼承這兩個類的都強制要寫try catch不然就會直接報文法錯誤。Exception下還有一個RuntimeException子類(常見異常or不是很重要的異常),繼承這個類的則不會要求寫try catch,因為對開發熟練的工程師一般可以避免出現這種異常,不然所有異常都要求寫try catch的話,這樣寫一段代碼就要寫一個try catch會顯得煩贅。

<a href="https://s1.51cto.com/oss/201710/19/64499a242f880925fa2a81e805e2365c.png" target="_blank"></a>

通用異常陷阱:

  異常對象裡還有通用的捕獲陷阱,一般有其他陷阱的情況下通用陷阱要寫在最後面,寫在前面的話全部異常都會進入這個陷阱了,開發中最好少寫通用陷阱,因為發生錯誤了不知道具體是什麼錯誤。

<a href="https://s1.51cto.com/oss/201710/19/87e9a7ebc626ee9c596ef3d32b527459.png" target="_blank"></a>

try catch裡代碼執行流程:

<a href="https://s1.51cto.com/oss/201710/19/da8ed0c33149a08049a7a81afbf3659a.png" target="_blank"></a>

  因為在第14行代碼出現類型轉換錯誤,而且沒有相對應的異常捕獲陷阱,這個異常就會往外抛,抛到main方法外的try catch裡。因為這個異常沒有被處理是以下面的代碼一句都不會執行的,是以隻會列印1 2然後列印異常。

  因為在第16行代碼出現記憶體溢出錯誤,然後就進入相對應的異常捕獲陷阱裡,異常被處理了後面的代碼就會繼續執行,是以列印 1 2 3 4 7 8。這種情況要看虛拟機配置設定的記憶體,如果是配置設定的少于2G就隻會列印1 2 3 7 8,如果配置設定的少于1G就隻會列印 1 2 7 8。

<a href="https://s4.51cto.com/oss/201710/19/562e4e2856bb684dcffaaeba23562acd.png" target="_blank"></a>

   try catch可以進行嵌套使用,因為在第12行代碼出現數組下标越界錯誤,而且沒有相對應的異常捕獲陷阱,這個異常就會往外抛,抛到main方法外的try catch裡,被列印出來。因為這個異常沒有被處理是以外層try catch下面的代碼一句都不會執行的。 

<a href="https://s5.51cto.com/oss/201710/19/39353e2309bf0c3e98cb2e1f346251be.png" target="_blank"></a>

  沒有出現類型轉換錯誤的原因是因為,s的值是null沒有記憶體裡面是空的,是以在轉換的時候不明确s是什麼類型,是以就會轉換成功沒有出現錯誤,一旦裡面有值即便是””也會報錯。

<a href="https://s5.51cto.com/oss/201710/19/da9e56ee10a76eb7bc2f102e631314f2.png" target="_blank"></a>

本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/1974350,如需轉載請自行聯系原作者

繼續閱讀