2009-12-08 40 views
31

我面臨一個使用情況下,我想聲明static final場與被聲明爲拋出checked異常的初始化語句靜態最終字段初始值。通常情況下,它會是這樣的:如何處理拋出的checked exception

public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");

我這裏的是,ObjectName構造函數可能會拋出各種檢查異常,我不關心這個問題(因爲我知道我的名字是有效的,如果它不幸發生崩潰,那麼它是沒問題的)。 Java編譯器不會讓我忽略這一點(因爲它是一個checked exception)時,我寧願不訴諸:

 
public static final ObjectName OBJECT_NAME; 
static{ 
    try{ 
     OBJECT_NAME = new ObjectName("foo:type=bar"); 
    }catch(final Exception ex){ 
     throw new RuntimeException("Failed to create ObjectName instance in static block.",ex); 
    } 
} 

因爲靜態塊是真的,真的很難看。有沒有人有如何以一個很好,乾淨的方式處理這個案件的建議?

+0

我個人的解決方案是拋出'CheckedExceptionsAreAPainInTheAssSometimesException',這是一個運行時異常。該程序將只會崩潰。 – Airhead 2017-10-18 01:34:22

回答

40

如果你不喜歡靜態塊(有的人不),那麼還有一個辦法是使用靜態方法。 IIRC,喬希布洛赫推薦這個(顯然不是在快速檢查的有效Java)。

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar"); 

private static ObjectName createObjectName(final String name) { 
    try { 
     return new ObjectName(name); 
    } catch (final SomeException exc) { 
     throw new Error(exc); 
    } 
} 

或者:

public static final ObjectName OBJECT_NAME = createObjectName(); 

private static ObjectName createObjectName() { 
    try { 
     return new ObjectName("foo:type=bar"); 
    } catch (final SomeException exc) { 
     throw new Error(exc); 
    } 
} 

(編輯:校正後的第二示例,從方法返回,而不是分配static

+2

我沒想到這件事,儘管現在我讀它,我敢肯定100%,我很久以前使用這種方法。我會使用它,因爲我不喜歡靜態塊,也喜歡我的代碼可以被初學者閱讀(你永遠不知道誰會自己維護你的代碼:))。 – Romain 2009-12-08 14:17:54

+0

給我一個編譯器錯誤「必須返回一個ObjectName類型的結果」 - 一個簡單的解決方案是在'catch'塊中有'return null'嗎?但後來有點奇怪調試 – mmcrae 2014-11-12 22:54:47

+0

我認爲你指的是項目59:避免不必要地使用檢查的異常(Effective Java,2nd Edition)。在那篇文章中,Bloch建議代碼的作者引發一個異常,以考慮它的客戶是否可以在遇到異常時採取一些有用的行動。這不同於這種情況,問題不是拋出異常的合法性,而是如何最好地處理異常。從查看'java.lang.Error'的文檔,我發現拋出一個錯誤的感覺並不是這裏要做的最好的事情。 – nullstellensatz 2015-09-19 16:45:13

5

static塊並不難讀。所以我會推薦這個解決方案。 但是,你可以用你的對象在另一個對象,例如 ObjectNameWrapper這股的interfaceObjectName,且其構造函數調用您的ObjectName構造函數,隱藏所有檢查發生的異常。但是,我再次選擇靜態選項。

+2

引入另一個對象似乎很鈍。 – 2009-12-08 13:21:27

+1

我當然同意你的看法。你的靜態方法建議更好。 – Bozho 2009-12-08 13:35:37

16

你的代碼是完全有效的。我不覺得難以閱讀。其他方式只會使情況更糟。他們對於初學者來說只是難以閱讀,因爲他們中的大多數人都不熟悉這一點。只需遵循關於代碼中元素排序的標準約定。例如。不要在代碼的中間或整個底部放置靜態初始化器,也不要在整個類中傳播多個靜態初始化器。在靜態聲明之後,只需在頂部放一個。

+0

這是一個非常有效的點(所以我投它雖然不接受的話),螞蟻GPP也是最好的說明。我不會使用這種方法,因爲正如你所說,這對於初學者來說只是難以理解/閱讀的......而且我無法確保在我之後維持它的人會有經驗:)。 – Romain 2009-12-08 14:20:44

+0

我不確定我是否願意。通過將其重構爲「私有靜態」方法,您可能會失去監督權。通常的做法是將這些方法(效用方法)放在整個課堂的底部。但是,好的,現在你有IDE,這樣你就可以點擊前進。 – BalusC 2009-12-08 14:33:13

相關問題