[英]Overhead associated with Exception vs Throwable in Java
我知道
throw new Exception();
有很大的開銷,因為它創建了一個完整的stackTrace等。
是否
throw new Throwable();
出現同樣的問題? 這種行為是繼承的,還是拋出Throwable有一個較小的(o no)開銷?
編輯
從分析師的角度來看,插入錯誤密碼的用戶是程序正常執行順序的例外。 所以,如果我有:
public Session newSession() {
validate_user_and_password();
}
從分析師的角度來看,拋出UserNotValidException聽起來是正確的。
如果您的代碼具有相當好的抽象,則返回null
或0
只是聽起來不正確。 我只是想知道我是否可以在代碼中實現這一點,或者如果我不得不將它留給理論。
編程視點異常與分析師視點異常之間存在很大差異。
注意:我給出了一個非常簡單而愚蠢的例子,這不是我的情況。
注2:我知道返回null
將是普通的事情,但我需要有適當的抽象和OO代碼,而且,就個人而言,我認為沒有任何傷害。
不,你需要自己的子類來避免這種影響。
Exception ex = new Exception() {
@Override public Throwable fillInStackTrace() {
return this; // and do nothing else
}
};
這會創建一個異常實例,它不會填充堆棧跟蹤(創建例外委托給fillInStackTrace
來實際填充堆棧跟蹤),因此創建起來很便宜。
使用JIT編譯,實際上並不是在Java中拋出Exception
有很多被無意中聽到的Exception
。 但投擲Throwable
並沒有太大的不同,因為你也會得到一個堆棧跟蹤。
如果您感興趣,有一篇非常有趣的論文稱為“即時編譯中的高效Java異常處理”( 鏈接 )。 不是輕松閱讀,但信息量很大。
Throwable
是Exception的父類。 所以Exception class
繼承自Throwable
。
你永遠不應該扔或抓住Throwable.
例外的范圍太大了。
如前所述,只有在需要時才應使用例外情況,即:在特殊情況下,應針對產生它們的情況。 除此之外,捕獲Throwable
意味着一系列異常,例如OutOfMemoryException
。 這種程度的錯誤無法從(輕松)恢復,不應由開發人員處理。
java.lang.Exception
擴展了java.lang.Throwable
,因此它的開銷相同。 來自Javadoc :
Throwable類是Java語言中所有錯誤和異常的超類。 只有作為此類(或其子類之一)的實例的對象才被Java虛擬機拋出,或者可以被Java throw語句拋出。 類似地,只有這個類或其子類之一可以是catch子句中的參數類型。
兩個子類的實例Error和Exception通常用於表示發生了異常情況。 通常,這些實例是在特殊情況的上下文中新創建的,以便包括相關信息(例如堆棧跟蹤數據)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.