2017-06-30 44 views
0

爲了提高軟件的可靠性,我不應該拋出java「標準」異常(NullPointerException)。 現在我有這樣的代碼:向覆蓋的方法添加拋出聲明

public JsonElement serialize(ExerciseType ex, Type typeOfSrc, JsonSerializationContext context) { 

    if(sMuscleMap == null || sLanguageMap == null || sEquipmentMap == null) 
     throw new NullPointerException("At least one map in " + TAG + " has not been initialized"); 


    JsonObject mainObject = new JsonObject(); 
} 

的方法 「連載」 覆蓋com.google.gson.JsonSerialize方法。 我創建了我的ErrorException,但是我不能拋出它,因爲我必須將throws declaretion添加到方法的簽名中,我當然也不能修改「original」「serialize」方法。 有一個竅門可以做到嗎?

+0

那麼你可以返回任何值,如空值或在serialize方法中的東西,然後可以在調用方法中檢查值 –

+0

不要爲運行時異常聲明'throws',儘管你應該用在Javadoc的評論中有'@ throws'。 –

+0

「serialize'方法覆蓋...「你忘了放入'@ Override'註釋。 –

回答

1

我已經建立了我ErrorException

ErrorException是兩個不同的東西。
您應該注意要使用的異常和基類的命名。 由於Error意味着一個嚴重的問題,因此您應該擴展Exception而不是Error

的方法 「連載」 覆蓋com.google.gson.JsonSerialize方法

有一招,辦呢?

你可以通過引入 一個包裝了JSonSerializer,並委託給它的處理一個作文課有利於在inheritancy組成。
但它真的很有價值嗎?

爲了更進一步,重寫JSonSerializer這個方法真的有價值嗎?
缺少必填字段時上升NullPointerException已足夠普遍。
這是替代0123'。

這種做法可以防止上升NullPointerException沒有有用的消息到類客戶端。

爲什麼你認爲你應該引入一個檢查的異常而不是NullPointerException

如果該字段是強制性的,客戶端應該簡單地改變其調用方法的方式。
它不應該能夠在運行時恢復問題。

1

爲了滿足Liskov替代原則,您不能對超類別無法識別的重寫添加限制。由於非法參數是程序員的錯誤,因此它們應該由運行時異常指示,而不是檢查異常。幸運的是,已經有一個非法參數的標準運行時異常,IllegalArgumentException。使用它。將它記錄在Javadoc註釋中用於覆蓋,但不能將其作爲實際方法簽名的一部分。