向重写方法添加throws声明

时间:2017-06-30 17:39:08

标签: java android

为了提高软件的可靠性,我不应该抛出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();
}

“serialize”方法会覆盖com.google.gson.JsonSerialize方法。 我已经创建了我的ErrorException但我不能抛出它,因为我必须将throws声明添加到方法的签名中,我当然也不能修改“原始”“序列化”方法。 有一个技巧可以做到吗?

2 个答案:

答案 0 :(得分:1)

  

我已经创建了我的ErrorException

ErrorException是两个不同的东西 您应该注意异常的命名和要使用的基类。 您应该延长Exception而不是Error,因为Error意味着一个严重的问题。

  

方法"序列化"覆盖com.google.gson.JsonSerialize方法

     

有一个技巧可以做到吗?

你可以通过介绍来支持组合而不是继承 一个组合类,它包装JSonSerializer并将处理委托给它 但它真的有价值吗?

更进一步,覆盖JSonSerializer的这种方法真的很有价值吗? 当缺少必填字段时,NullPointerException的上升很常见。
它可以替代IllegalArgumentException

这种做法可以防止在没有有用信息的情况下将NullPointerException升级到班级客户端。

为什么您认为应该引入已检查的例外而不是NullPointerException

如果该字段是强制性的,则客户端应该简单地改变其调用方法的方式 它不应该在运行时恢复问题。

答案 1 :(得分:1)

要满足Liskov替换原则,您不能对超类无法识别的覆盖添加限制。由于非法参数是程序员错误,因此它们应该由运行时异常指示,而不是检查异常。值得庆幸的是,非法参数IllegalArgumentException已经存在标准的运行时异常。用那个。在您的覆盖的方法Javadoc注释中记录它,但您不能使它成为实际方法签名的一部分。