为了提高软件的可靠性,我不应该抛出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声明添加到方法的签名中,我当然也不能修改“原始”“序列化”方法。 有一个技巧可以做到吗?
答案 0 :(得分:1)
我已经创建了我的ErrorException
Error
和Exception
是两个不同的东西
您应该注意异常的命名和要使用的基类。
您应该延长Exception
而不是Error
,因为Error
意味着一个严重的问题。
方法"序列化"覆盖com.google.gson.JsonSerialize方法
有一个技巧可以做到吗?
你可以通过介绍来支持组合而不是继承
一个组合类,它包装JSonSerializer
并将处理委托给它
但它真的有价值吗?
更进一步,覆盖JSonSerializer
的这种方法真的很有价值吗?
当缺少必填字段时,NullPointerException
的上升很常见。
它可以替代IllegalArgumentException
。
这种做法可以防止在没有有用信息的情况下将NullPointerException
升级到班级客户端。
为什么您认为应该引入已检查的例外而不是NullPointerException
?
如果该字段是强制性的,则客户端应该简单地改变其调用方法的方式
它不应该在运行时恢复问题。
答案 1 :(得分:1)
要满足Liskov替换原则,您不能对超类无法识别的覆盖添加限制。由于非法参数是程序员错误,因此它们应该由运行时异常指示,而不是检查异常。值得庆幸的是,非法参数IllegalArgumentException
已经存在标准的运行时异常。用那个。在您的覆盖的方法Javadoc注释中记录它,但您不能使它成为实际方法签名的一部分。