我听到有些声音说从方法返回null值并进行检查是不好的设计。我希望听到一些原因。
伪代码:
variable x = object.method()
if (x is null) do something
我听到有些声音说从方法返回null值并进行检查是不好的设计。我希望听到一些原因。
伪代码:
variable x = object.method()
if (x is null) do something
这不一定是一个糟糕的设计 - 就像许多设计决策一样,它取决于实际情况。
如果该方法的结果在正常使用中不会产生良好的结果,则返回null是可以接受的:
object x = GetObjectFromCache(); // return null if it's not in the cache
如果确实应该始终存在非空结果,那么抛出异常可能更好:
try {
Controller c = GetController(); // the controller object is central to
// the application. If we don't get one,
// we're fubar
// it's likely that it's OK to not have the try/catch since you won't
// be able to really handle the problem here
}
catch /* ... */ {
}
Optional<>
。 - Piotr Müller异常是为了处理特殊情况而存在的。
如果您的函数旨在查找与给定对象相关联的属性,但该对象没有此类属性,则返回null可能是适当的。如果对象不存在,则抛出异常可能更合适。如果函数旨在返回属性列表,并且没有要返回的属性,则返回空列表是有意义的 - 您正在返回所有零属性。
如果返回null有意义的话,那么这样做是可以的。
public String getEmployeeName(int id){ ..}
public Integer getId(...){
try{ ... ; return id; }
catch(Exception e){ return null;}
}
你认为除了返回null,还有哪些选择?
我看到两种情况:
在这种情况下,我们可以:返回Null或抛出(已检查的)异常(或者可能创建一个项目并返回它)。
在这种情况下,我们可以返回Null、返回空列表或抛出异常。
我认为返回null可能不如其他选择好,因为它要求客户端记得检查null,而程序员经常会忘记编码。
x = find();
x.getField(); // bang null pointer exception
在Java中,抛出一个受检异常RecordNotFoundException可以让编译器提醒客户端处理情况。
我发现返回空列表的搜索非常方便——只需用列表的所有内容填充显示,如果为空,代码“就能正常工作”。
嗯,这确实取决于方法的目的...有时候,更好的选择是抛出异常。这完全取决于具体情况。
command = get_something_to_do()
if command: # if not Null
command.execute()
get_something_to_do().execute()
所以,这里的问题不在于检查 NULL 和异常之间的区别,而是在于调用者是否必须以不同的方式(无论如何)处理特殊的非情况。