我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
当前回答
例外情况与契约式设计有关。
一个对象的接口实际上是两个对象之间的契约,调用方必须满足契约,否则接收方可能会异常失败。有两种可能的契约
1)所有输入的方法都是有效的,在这种情况下,当对象没有找到时必须返回null。
2)只有某些输入是有效的,即导致找到对象的输入。在这种情况下,您必须提供第二个方法,允许调用者确定其输入是否正确。例如
is_present(key)
find(key) throws Exception
当且仅当你提供了第二个契约的两个方法,你被允许抛出异常,但什么都没有发现!
其他回答
它不包含对象可能发生在正常操作期间,应该由调用者返回NULL来处理。
如果不包含对象表明调用代码或内部状态存在错误,则执行断言。
如果不包含该对象,则表示不经常发生事件。(就像有人从商店中删除了一件商品,而你同时还在结账。)然后抛出异常。
“其他”选项可以是让find方法接受一个带有默认对象的附加参数,如果无法找到所寻找的对象,将返回该默认对象。
否则,我只返回null,除非它确实是一个例外的情况,当对象没有找到。
使用空对象模式或抛出异常。
返回空值而不是抛出异常,并在API文档中清楚地记录空返回值的可能性。如果调用代码不遵守API并检查空情况,它很可能会导致某种“空指针异常”:)
在c++中,我可以想到3种不同的方法来设置查找对象的方法。
选择一个
Object *findObject(Key &key);
当找不到对象时返回null。很好很简单。我选这个。下面的替代方法是为那些不讨厌out-params的人准备的。
选项B
void findObject(Key &key, Object &found);
传入一个将接收该对象的变量引用。当找不到对象时,该方法抛出异常。如果不是真的期望找不到对象,那么这种约定可能更适合——因此您可以抛出异常来表示这是一个意外情况。
C选项
bool findObject(Key &key, Object &found);
当找不到对象时,该方法返回false。与选项A相比,这个选项的优点是,您可以在一个明确的步骤中检查错误情况:
if (!findObject(myKey, myObj)) { ...
在数据层代码中,我有时使用以下代码,允许调用者决定“对象未找到”是否意味着发生了错误。
DataType GetObject(DBConnection conn, string id, bool throwOnNotFound) {
DataType retval = ... // find object in database
if (retval != null || ! throwOnNotFound) {
return retval;
} else {
throw new NoRowsFoundException("DataType object with id {id} not found in database");
}
}
DataType GetObject(DBConnection conn, string id) {
return GetObject(conn, id, true);
}