2013-09-26 33 views
0

如果我有一個像IllegalArg Vs的空檢查

class A 
{ 
    Private B b; 

    X getX() 
    { 
     X x = b.newClient().call(); 
    } 

} 

這裏的一類,我應該檢查,如果b爲null?這應如何處理?使用異常(例如,這不是一個真正的論據,所以拋出一個非法的參數是有道理的嗎?或者只是記錄一個錯誤?

+0

真的取決於B是什麼以及它的業務邏輯,有時候檢查null和創建它是安全的,而其他時候這是沒有意義的。 –

+0

如果'b'爲'null',某人忘記以一種合理的方式初始化它。如果'b'的初始化可以返回'null',那麼你還有其他一些問題。 (你的攻擊點將是麻煩的初始化。) – Makoto

回答

1

private B b是你隱藏的內部實現的一部分(即它不是公共API的一部分,類的客戶端),所以它不是一個客戶端的問題b爲空,這是問題,作爲類的開發者。


試想一下,如果你試圖用你得到了一些閃閃發光的新圖書館off GitHub:

MagicAnythingParser parser = new MagicAnythingParser(); 
parser.parse(myDocument); 

,並調用parse拋出異常說"intakeManifold is null"。你會想:「到底是什麼?!」

沒想到,你知道嗎,你是預計先撥打電話,如:

parser.setupParseRules(someRuleset); 

並在內部,這造成了一些對象,並將其分配給intakeManifold

一個更好的情況是,如果MagicAnythingParser做跟蹤其內部狀態的一個好工作,而不是扔的東西像一個IllegelStateException("No parse rules applied. You must call setupParseRules first.")


我的整個觀點是,你應該制定的公共API您班,在頭腦裏的客戶(即使客戶端是你)儘量確保你的對象始終處於「良好狀態」 - 當你不能,拋出有意義的異常,使得它言自明什麼問題是。

0

您是否有處理空指針可能性的策略?即如果變量不能爲空,並且因此表示一個錯誤,那麼你可能不想隱藏它。我非常喜歡讓系統在我的臉上炸開,以便迅速找到故障並很容易確定問題的根源。

如果你的代碼被設計成批量加工時,無論如何進行,例如,你不希望在一個批處理項一個故障殺死整批,然後才能登錄,或別的什麼東西。但除此之外就是讓NPE做到這一點。

0

察看b的getX空不買你多少。您正在交易另一個運行時異常。你真的想知道爲什麼b爲空。

我會建議做b最終並通過構造函數設置它。在構造函數中執行空檢查。