我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
我使用java语言,我有一个方法,如果它被找到,应该返回一个对象。
如果没有找到,我是否应该:
返回null 抛出异常 其他
哪一个是最好的实践或习语?
当前回答
例外情况与契约式设计有关。
一个对象的接口实际上是两个对象之间的契约,调用方必须满足契约,否则接收方可能会异常失败。有两种可能的契约
1)所有输入的方法都是有效的,在这种情况下,当对象没有找到时必须返回null。
2)只有某些输入是有效的,即导致找到对象的输入。在这种情况下,您必须提供第二个方法,允许调用者确定其输入是否正确。例如
is_present(key)
find(key) throws Exception
当且仅当你提供了第二个契约的两个方法,你被允许抛出异常,但什么都没有发现!
其他回答
如果对于客户端代码来说,知道已找到和未找到之间的区别很重要,并且这应该是一个例程行为,那么最好返回null。然后客户端代码可以决定要做什么。
如果方法返回一个集合,则返回一个空集合(如上所述)。但请不要收钱。EMPTY_LIST或类似的!(以Java为例)
如果该方法检索单个对象,则您有一些选项。
If the method should always find the result and it's a real exception case not to find the object, then you should throw an exception (in Java: please an unchecked Exception) (Java only) If you can tolerate that the method throws a checked exception, throw a project specific ObjectNotFoundException or the like. In this case the compiler says you if you forget to handle the exception. (This is my preferred handling of not found things in Java.) If you say it's really ok, if the object is not found and your Method name is like findBookForAuthorOrReturnNull(..), then you can return null. In this case it is strongly recomminded to use some sort of static check or compiler check, wich prevents dereferencing of the result without a null check. In case of Java it can be eg. FindBugs (see DefaultAnnotation at http://findbugs.sourceforge.net/manual/annotations.html) or IntelliJ-Checking.
如果决定返回null,请小心。如果你不是项目中唯一的程序员,你会在运行时得到nullpointerexception(在Java或其他语言中)!所以不要返回在编译时没有检查的空值。
只提到null不被认为是异常行为的情况,我肯定是try方法,很明显,没有必要“阅读书籍”或“三思而后行”,就像这里所说的那样
所以:
bool TryFindObject(RequestParam request, out ResponseParam response)
这意味着用户的代码也将是清晰的
...
if(TryFindObject(request, out response)
{
handleSuccess(response)
}
else
{
handleFailure()
}
...
如果null从不表示错误,则返回null。
如果null始终是错误,则抛出异常。
如果null有时是一个异常,那么编写两个例程。一个例程抛出异常,另一个是布尔测试例程,它在输出参数中返回对象,如果没有找到对象,则返回false。
很难滥用Try例程。很容易忘记检查null。
所以当null是一个错误时,你只需要写
object o = FindObject();
当null不是错误时,您可以编写如下代码
if (TryFindObject(out object o)
// Do something with o
else
// o was not found
使用空对象模式或抛出异常。