Exception和Error有什麼區別
Exception和Error有什麼區別 Exception和Error有什麼區別
基本回答
共同點:
都繼承了Throwable類,在Java中,只有Throwable或其子類才能被丟擲(throw)或者被捕獲(catch)
不同點:
- 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就會對當前棧產生一個快照,這是一個相對繁重的操作; 基本回答 共同點: 都繼承了Throwable類,在Java中,只有Throwable或其子類才能被丟擲(throw)或者被捕獲(catch)
不同點: 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