Exception和Error有什麼區別 Exception和Error有什麼區別程序員
都繼承了Throwable類,在Java中,只有Throwable或其子類才能被拋出(throw)或者被捕獲(catch)編程
- 檢查異常(checked excepttion): 這一部分異常是應該被處理掉的,若是程序中沒有處理的話,編譯不會經過。這類異常有兩種處理方式,一是利用try-catch語法來處理,另外一種是繼續向上一級調用層級拋出(throws)該類異常。繼承Exception就能夠定義一個檢查異常類。例:IOException,FileNotFoundException,SQLException,ClassNotFoundException,FileAlreadyExistsException,CloneNotSupportedException
- 運行時異常(RuntimeException): 這一部分異常編譯器不會強制讓開發者處理。但這一類異常最好在合適的地方聲明(throw),這樣,當程序出現問題的時候就能夠準確的定位了。繼承RuntimeException就能定義一個運行時異常。例:ClassCastException,NullPointerException,IndexOutOfBoundsException,ConcurrentModificationException
處理異常的方式:函數式編程
tips: 通常來講,當程序執行到某一步的時候,若是知足了異常定義的條件,便會在這個時候生成一個異常對象,這個異常對象會終止當前的線程函數
不一樣點: Error:在正常狀況下,不太可能出現的問題。絕大部分Error都會致使程序自己(好比JVM)出現不可避免的,不可恢復的狀態。因此這樣的問題也沒有在程序中進行處理的必要。 Exception:程序正常運行中,能夠預料的意外狀況。這部分問題被稱爲異常,大部分是程序員在程序中可以解決的。在異常下面還分爲檢查異常和運行時異常。 檢查異常(checked excepttion): 這一部分異常是應該被處理掉的,若是程序中沒有處理的話,編譯不會經過。這類異常有兩種處理方式,一是利用try-catch語法來處理,另外一種是繼續向上一級調用層級拋出(throws)該類異常。繼承Exception就能夠定義一個檢查異常類。例:IOException,FileNotFoundException,SQLException,ClassNotFoundException,FileAlreadyExistsException,CloneNotSupportedException 運行時異常(RuntimeException): 這一部分異常編譯器不會強制讓開發者處理。但這一類異常最好在合適的地方聲明(throw),這樣,當程序出現問題的時候就能夠準確的定位了。繼承RuntimeException就能定義一個運行時異常。例:ClassCastException,NullPointerException,IndexOutOfBoundsException,ConcurrentModificationException 處理異常的方式:性能
上一級調用層級拋出(throws):讓處理這個問題的邏輯放在了上一層,在程序設計中若是分有多個模塊或者層級關係,經過這種方式是頗有必要的,可是不能什麼都讓上一級調用層處理,應該本身處理的就必定要在本身程序中處理; try-catch語法: 一般一個異常出現了,該線程會隨着異常調用棧死掉,而try-catch語法的目的就是不讓程序在這個地方就死掉,或者說程序有能力再往下執行,而且該異常的發生不影響業務邏輯的進行,就應該讓它執行下去。 tips: 通常來講,當程序執行到某一步的時候,若是知足了異常定義的條件,便會在這個時候生成一個異常對象,這個異常對象會終止當前的線程優化
如何使用Exception(異常) 儘可能不要 catch (Exception)或catch(Throwable)這樣操做,catch特定的異常將會返回更豐富的信息。而且,catch 大異常一般是沒有保證程序有能力往下執行(出現了OOM,程序並不能處理這樣的問題),或者沒有保證該異常的發生是不影響業務邏輯的進行的。 咱們要保證程序不會捕獲咱們不但願捕獲的異常。例:RuntimeException應該被擴散出來,而不是被捕獲。 不要生吞(swallow)異常,也就是捕獲了異常,不要無論了; 產品中,printStackTrace()方法更多的應該輸出向日志中,而不是程序中直接打印出來; throw early,catch late原則。出現的異常應該儘早的拋出,這樣方便定位;應該在儘量靠近異常發生的位置處理異常,或者向上一級拋出; 在保證診斷信息足夠的狀況下,應該儘量的避免輸出敏感信息(用戶我的信息); checked exception的爭議 檢查異常是假設咱們捕獲了異常,而後恢復程序;不過在實際開發中,這樣的狀況幾乎不會發生;如今對其的使用已經偏離了設計時的目的了; 檢查異常不支持函數式編程; 異常對性能的影響 try-catch語法會影響JVM對代碼的優化,因此,try-catch的代碼塊應該覆蓋得少一下爲好; 雖然try-catch方式能夠作一些邏輯處理,可是從性能角度看,儘可能不要這麼作; Java每實例化一個Exception就會對當前棧產生一個快照,這是一個相對繁重的操做; Markdown 1771 bytes 61 words 29 lines Ln 1, Col 0 HTML 1644 characters 37 words 27 paragraphs線程