1 參數校驗的意義
大多數方法對傳遞給它們的參數值有限制。例如,索引值必須非負,對象引用必須非空。
應該清楚地在文檔中記錄所有這些限制,并在方法主體的開頭使用檢查來實施它們。
應該在錯誤發生後盡快找到它們,這是一般原則。如果不這樣做,就不太可能檢測到錯誤,而且即使檢測到錯誤,确定錯誤的來源也很難。
若一個無效參數被傳遞給一個方法
若該方法在執行前檢查參數,這過程将迅速失敗,并引發異常
若方法未檢查參數,可能會在處理過程中出現:
莫名其妙的異常而失敗
正常傳回,但會悄悄計算錯誤結果
正常傳回,但會使某對象處于隐患狀态,可能在未來某不确定時間在某不相關代碼點報錯。
總之,若無驗證參數,可能會違反失敗原子性。
對public、protected方法,要在方法說明使用 Javadoc 的 @throws 标簽說明如果違反參數值限制時會抛出的異常。通常為 IllegalArgumentException、IndexOutOfBoundsException 或 NullPointerException。一旦在文檔中記錄了方法參數上的限制,并且記錄違反這些限制将引發的異常,強加這些限制就很簡單了。
看案例:
文檔注釋并沒說「若 m 為空,mod 将抛NPE」,盡管方法确實這麼做了,作為調用 m.signum() 的副産物。該異常記錄在外圍 BigInterger 類級别的文檔注釋。類級别注釋适用于類的所有public方法中的所有參數。這可以避免在每個方法上分别記錄每個 NullPointerException 而造成混亂。
它可與 @Nullable 或類似注解結合使用,以訓示某特定參數可能為 null,但這種做法并不标準,而且使用了多個注解。
2 最佳實踐
Java 7 提供
Objects.requireNonNull
不再需手動執行空檢查。
如果願意,還可自定義異常詳情。該方法傳回其輸入,是以使用一個值的同時可執行判空:
// 内置 Java 的判空功能
this.strategy = Objects.requireNonNull(strategy, "strategy");
也可以忽略傳回值并使用
Objects.requireNonNull
作為一個獨立判空方法。