2013-12-21 162 views
1

我應該怎麼做,如果有接收空或意外值的方法:拋出異常或對待異常?

  • 值轉換爲正常值(款待除外) 或
  • 拋出一個異常,因爲值是無效的?
+1

_ 「在你看來」 _。這只是爲了獲得接近的選票。也許重新格式化這個問題。它看起來並不像是一個有見識的問題。 –

+1

如果你不得不問,你應該拋出異常。不得不提問意味着你不知道在你的方法背景下做的正確事情。 –

回答

1

這取決於你的用例。

如果您希望API的用戶處理無效,因爲您的API沒有指定應如何處理無效性,請拋出異常。

你也可以檢查null,然後拋出一個IllegalArgumentException異常,並給出解釋爲什麼不允許null的消息,或者可能的值。但是,如果要在實現中處理空值,則必須清楚地說明該方法如何處理空條件。

例如,看看StringUtilsEnumUtils如何在Apache commons-lang中處理無效。

異常處理的另一個有趣的閱讀是here

可能的使用情況:

檢查空,默認爲缺省值:這應該在方法的規範進行記錄。

if(value == null) { 
    value = DEFAULT_VALUE; 
} 

這是首選當API需要徵收默認行爲。缺點是,缺省行爲不容易被API的用戶改變。

檢查空和投擲檢查異常主要是爲了迫使API的用戶來處理無效的情況:

if(value == null) { 
    throw new MyCheckedException("Value cannot be null"); 
} 

API的用戶需要辦理或者重新擲它:

try { 
    MyObject value = doWork(); 
} catch (MyCheckedException e) { 
    handleException(e); 
} 

此方法允許API的用戶更好地控制異常處理。

以上兩種方法都是安全的。

但是,如果您希望系統在遇到空值時僅在運行時發生故障,並且不強制API的用戶處理該異常,則可能會用運行時異常包裝它。

檢查空和投擲運行時異常:

if(value == null) 
    throw new MyRuntimeException("Value is null"); 

在任何情況下,你會留下空條件選中。

2

這非常依賴於您的上下文。我只能評論說JDK API經常選擇拋出異常,這會在方法調用之前強制添加樣板檢查。特別會傷害的是方法的可組合性,其中您希望null值能夠無縫地通過鏈接調用傳播,並且只能在最後被檢測到,而不是在每個特定步驟進行艱苦檢查,這需要大量的開銷局部變量保持中間結果的方式,if-branching等等。

因此,以上述爲準則來指導您的選擇。

1

如果只有開發者的情況應該知道它的一個bug。

assert value != null; 

如果它的情況值不必爲空。

if (value == null) throw new NullPointerException(); 

如果它的情況值真不應該爲空。

if (value == null) LOGGER.error("Null value!", new NullPointerException()); 

如果它的情況值可能不應該爲空。

if (value == null) LOGGER.warn("Null value."); 

如果它的情況值非常空。

if (value == null) LOGGER.info('Value is null.'); 

任何其他情況:

它的設計問題,你可以從過載到void foo(Object maynull)void foo()方法?也許一個類中的字段通常可以爲null,將其重新設計爲Object和Wrapper類。

在示例(假設你沒有懶惰干將):

public class Car{ 
    Passengers[] p; // Bad idea 
    Passengers[] p=new Passengers[0]; // Good idea 

    List<Passengers> p; // Bad idea 
    List<Passengers> p=new ArrayList<>(); // Good idea 
} 

或所述實施例:

// Bad idea 
public class Tree{ 
    Bird motacillaFlava=null; 
    ... 
} 

// Good idea 
public class Tree{...} 
public class BirdInTree{Tree t; Bird motacillaFlava;} 

問候。

注意:斷言只適用於-ea標誌