簡體   English   中英

與Java中的Exception vs Throwable相關聯的開銷

[英]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聽起來是正確的。
如果您的代碼具有相當好的抽象,則返回null0只是聽起來不正確。 我只是想知道我是否可以在代碼中實現這一點,或者如果我不得不將它留給理論。

編程視點異常與分析師視點異常之間存在很大差異。

注意:我給出了一個非常簡單而愚蠢的例子,這不是我的情況。
注2:我知道返回null將是普通的事情,但我需要有適當的抽象和OO代碼,而且,就個人而言,我認為沒有任何傷害。

Throwable創建時也會創建堆棧跟蹤。 來自Throwablejava文檔

throwable包含其創建時線程執行堆棧的快照。

因此,就創建堆棧跟蹤的開銷而言, ExceptionThrowable之間應該沒有區別。

如果您使用“異常事件”的異常(就像您應該這樣),那么您不應該過多關注堆棧跟蹤的開銷。 在運行代碼中很少發生異常事件。 因此,異常不應以任何重要方式影響正常代碼的性能。

不,你需要自己的子類來避免這種影響。

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例外

正如@mangoDrunk所說:“Throwable是異常和錯誤的超類。”

您可以查看這兩個類的源代碼,看看除了暴露與Throwable相同的構造函數之外, Exception不會做任何事情。 所有的肉,因此頭頂上,都生活在Throwable

即使Exception確實引入了一些額外的開銷,也可以使用Throwable進行明顯的過度優化。 使用正確的工具來完成工作,不要因為它更輕而選擇錯誤的工具。

java.lang.Exception擴展了java.lang.Throwable ,因此它的開銷相同。 來自Javadoc

Throwable類是Java語言中所有錯誤和異常的超類。 只有作為此類(或其子類之一)的實例的對象才被Java虛擬機拋出,或者可以被Java throw語句拋出。 類似地,只有這個類或其子類之一可以是catch子句中的參數類型。

兩個子類的實例Error和Exception通常用於表示發生了異常情況。 通常,這些實例是在特殊情況的上下文中新創建的,以便包括相關信息(例如堆棧跟蹤數據)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM