如果我有一個像IllegalArg Vs的空檢查
class A
{
Private B b;
X getX()
{
X x = b.newClient().call();
}
}
這裏的一類,我應該檢查,如果b爲null?這應如何處理?使用異常(例如,這不是一個真正的論據,所以拋出一個非法的參數是有道理的嗎?或者只是記錄一個錯誤?
如果我有一個像IllegalArg Vs的空檢查
class A
{
Private B b;
X getX()
{
X x = b.newClient().call();
}
}
這裏的一類,我應該檢查,如果b爲null?這應如何處理?使用異常(例如,這不是一個真正的論據,所以拋出一個非法的參數是有道理的嗎?或者只是記錄一個錯誤?
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您班,在頭腦裏的客戶(即使客戶端是你)儘量確保你的對象始終處於「良好狀態」 - 當你不能,拋出有意義的異常,使得它言自明什麼問題是。
您是否有處理空指針可能性的策略?即如果變量不能爲空,並且因此表示一個錯誤,那麼你可能不想隱藏它。我非常喜歡讓系統在我的臉上炸開,以便迅速找到故障並很容易確定問題的根源。
如果你的代碼被設計成批量加工時,無論如何進行,例如,你不希望在一個批處理項一個故障殺死整批,然後才能登錄,或別的什麼東西。但除此之外就是讓NPE做到這一點。
察看b是的getX空不買你多少。您正在交易另一個運行時異常。你真的想知道爲什麼b爲空。
我會建議做b最終並通過構造函數設置它。在構造函數中執行空檢查。
真的取決於B是什麼以及它的業務邏輯,有時候檢查null和創建它是安全的,而其他時候這是沒有意義的。 –
如果'b'爲'null',某人忘記以一種合理的方式初始化它。如果'b'的初始化可以返回'null',那麼你還有其他一些問題。 (你的攻擊點將是麻煩的初始化。) – Makoto