錯誤(Error):表示恢復不是不可能可是很困難的狀況下的一種嚴重問題。好比說內存溢出。不可能期望程序能處理這樣的狀況。java
異常(Exception):表示一種設計或實現問題。也就是說,它表示程序運行正常,從不會發生的狀況。ide
錯誤-----沒有經過編譯,在編譯時出錯。spa
異常-----經過編譯,在運行中出錯。設計
1 try{ 2 可能出現異常的代碼塊 3 return ***; 4 }catch(異常對象){ 5 一旦try中出現了異常則執行 6 return ***; 7 }finally{ 8 不管是否出現異常都會執行 9 }
注意:catch塊中必須有和try塊中return相同類型的return。code
在一個方法裏,return永遠是最後一步。對象
異常最大類:Exception。blog
全部用native修飾的,調用的都是底層系統的方法,沒有方法體。內存
java規範:不容許用異常作流程控制。字符串
finally代碼塊裏的內容何時被執行,在retutn錢仍是在return後?io
先來一段代碼:
1 public class A{ 2 public static int add(int a,int b){ 3 try{ 4 int c=a+b; 5 System.out.println("try"); 6 return c; 7 }catch(Exception e){ 8 System.out.println("catch"); 9 return 0; 10 }finally{ 11 System.out.println("finally"); 12 } 13 } 14 public static void main(String[] args){ 15 System.out.println(add(1,2)); 16 } 17 } 18 結果: 19 try 20 finally 21 3
經過反彙編命令javap -c A,能夠獲得下圖:
能夠看出,finally中的代碼塊是在return中間執行的。
下面來講說正常狀況:
1~9:首先把a和b的值壓棧,放到操做數棧的棧頂,而後相加,並把結果給了c,接下來把字符串try放到棧頂並輸出
12~19:把c的值壓棧,放到棧頂,而後再把棧頂的值給了c,而後在把字符串finally放到棧頂並輸出
22~23:把c的值進行壓棧,並輸出結果
如有錯誤之處,歡迎指正。謝謝!