2010-02-03 134 views
18

當構造函數無法處理的構造函數中的方法拋出檢查異常時,如果確定應用程序無法處理它並且在沒有對象正在構建?構造函數可以拋出運行時異常嗎?

+6

是的,從構造函數中拋出異常是放棄創建對象的標準方式。 – 2010-02-03 18:59:16

+0

+1 - OOP的新來者的好問題 – JonH 2010-02-03 19:00:08

回答

11

是的,這是不可避免的在許多構造反正當他們調用其他方法,因爲總有一種可能性,他們已經將拋出unchecked異常。

+0

這是一個很好的觀點。 – insipid 2010-02-03 19:08:17

4

是的,在構造函數中拋出異常是完全有效的。你很少或根本沒有別的選擇,只能做到這一點,特別是當你只是試圖構造一個對象時,只有沒有正確的工作

+0

澄清,你是否說它可以轉換爲未經檢查的例外。或者你的意思是添加一個throws子句? – insipid 2010-02-03 19:03:46

+4

我經常會用描述它的字符串拋出'IllegalArgumentException'。 – philfreo 2010-02-03 19:13:31

1

是的。除非你知道應該如何處理異常,否則最好扔掉它,而不是簡單地吞下它並打印出堆棧跟蹤(或者更糟糕的是,什麼都不做)。

這將有助於防止稍後出現一些極其難以調試的錯誤。

11

是的。這是標準做法。

Effective Java, 2nd Ed.這是由項目61覆蓋,「把適合於抽象例外」。在第58項「對可恢復條件使用已檢查的異常以及編程錯誤的運行時異常」中,有效Java也覆蓋了生成的異常是否已選中或未選中。

認爲這是一種構造函數,而不是一個正常的方法是不是一個真正的問題。 (事實上​​,構造函數可以說有更多的自由,因爲它們不受超級界面的約束。)

當拋出一個異常作爲另一個異常的結果時,確保你設置新的cause是個好主意例外。

+1

+1爲好源 – insipid 2010-02-03 19:29:44

+1

所有參考Effective Java的答案值得+1 :) – Fredrik 2011-10-18 10:20:46

2

如Chris Jester-Young所評論的那樣,拋出檢查異常以表示構建對象失敗是完全可以的。另一個問題是,拋出未選中例外是個好主意。你會放鬆編譯器的嘮叨,它促使你捕捉和處理異常,你一定會這麼做。

+0

爲什麼你想要?更多的時候,你不想處理它,它是一個錯誤,讓它運行到一個記錄器/作業處理程序的堆棧。 – reto 2011-09-29 15:47:11

1

個人而言,我討厭看到構造函數拋出checked異常(如doppeldish已經指出的那樣)。不過,你如何確定應用程序無法處理異常呢?即使應用程序無法處理它,也許用戶可以通過再次嘗試?

+0

+1需要考慮的事情:P謝謝 – insipid 2010-02-05 20:20:11

相關問題