我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
当前回答
不要认为任何人都提到了异常处理中的开销——需要额外的资源来加载和处理异常,所以除非它是一个真正的应用程序杀死或进程停止事件(继续下去会造成更多的伤害而不是好处),否则我会选择返回一个调用环境可以解释为它认为合适的值。
其他回答
这取决于你的语言和代码是否支持: 三思而后行 或 EAFP(请求原谅比请求允许容易)
LBYL说你应该检查值(所以返回null) EAFP表示只需尝试操作并查看它是否失败(抛出异常)
虽然我同意以上的观点。异常应该用于异常/错误条件,在使用检查时最好返回null。
Python中的EAFP vs. LBYL: http://mail.python.org/pipermail/python-list/2003-May/205182.html (Web存档)
与您正在使用的API保持一致。
这里还有一些建议。
如果返回一个集合,避免返回null,返回一个空集合,这使得枚举更容易处理,而不需要先进行空检查。
一些. net API使用thrownOnError参数的模式,如果对象没有找到,调用者可以选择是否真的是异常情况。类型。GetType就是一个例子。BCL的另一个常见模式是TryGet模式,其中返回一个布尔值,并通过输出参数传递值。
在某些情况下,您还可以考虑Null Object模式,它可以是默认的,也可以是没有行为的版本。关键是避免在整个代码库中进行空检查。更多信息请参见这里链接
只要问问你自己:“找不到对象是例外情况吗?”如果期望它在程序的正常过程中发生,则可能不应该引发异常(因为它不是异常行为)。
简短的版本:使用异常来处理异常行为,而不是处理程序中的正常控制流。
-工业。
在数据层代码中,我有时使用以下代码,允许调用者决定“对象未找到”是否意味着发生了错误。
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);
}