返回null是不好的设计吗?

142

我听到有些声音说从方法返回null值并进行检查是不好的设计。我希望听到一些原因。

伪代码:

variable x = object.method()
if (x is null) do something

14
详细说明一下:那些说这很糟糕的人在哪里?有链接吗? - jcollum
2
如果这个方法是你可以控制的,你可以编写单元测试来确保它永远不会返回 null。否则,我认为在调用之后检查是否为 null 并不是一种不好的做法;虽然该方法返回 null 可能是一种不好的做法,但你必须保护你的代码。 - BlackTigerX
9
仅仅因为没有数据返回而引发异常是非常烦人的。正常程序流程不应该抛出异常。 - Thorarin
4
@David:其实这就是我说的。如果一个方法应该返回数据,但没有返回任何数据,那也意味着出了问题。这不是正常的程序流程 :) - Thorarin
2
@Thorarin:“正常”的程序流程是一个相当灵活的概念:不是真正的论据基础。 - Tomislav Nakic-Alfirevic
显示剩余6条评论
24个回答

0

对于我的使用情况,我需要从方法中返回一个Map,然后查找特定的键。但是如果我返回一个空的Map,那么它将导致NullPointerException,这样返回null而不是空的Map并没有太大的区别。 但是从Java8开始,我们可以使用Optional。以上正是引入Optional概念的原因。


0
其他选项包括: 返回一些指示成功或失败(或错误类型)的值,但如果您只需要表示成功/失败的布尔值,则对于失败返回null,对于成功返回对象并不会更不正确,然后通过参数返回true/false和获取对象。 另一种方法是使用异常来表示失败,但在这里 - 实际上有很多声音说这是一个坏习惯(因为使用异常可能很方便,但有许多缺点)。 所以我个人认为,返回null作为指示出现问题的标志,并稍后检查它(以实际了解您是否已成功),并没有什么不好。此外,盲目地认为您的方法不会返回NULL,然后基于它构建代码,可能会导致其他错误,有时很难找到错误(尽管在大多数情况下,它只会崩溃您的系统:),因为您迟早会引用0x00000000)。

0
在开发复杂程序的过程中,意外的空函数可能会出现,就像死代码一样,这些情况表明程序结构存在严重缺陷。
空函数或方法通常用作对象框架中可重新定向函数或可覆盖方法的默认行为。 空函数@维基百科

-2

你好,

许多API在无法创建新对象时返回NULL是标准做法。

为什么这是不好的设计我不知道。

编辑:这适用于没有异常处理机制的语言,例如C语言,在这些语言中这已经成为惯例多年了。

希望对你有所帮助。

祝你愉快,


2
如果你无法创建一个对象,你应该抛出一个异常。如果你无法找到符合某个查询条件的对象,则返回null是可行的方法。 - Thilo
@Thilo,展示给我如何用C语言实现,我会非常感兴趣。 - Rob Wells
@RobWells C语言不是面向对象的语言,但这个问题被标记为“oop”。 - yegor256
@yegor256 您是正确的。我错过了原始的OOP标签。但是,正如BS所说,C ++中的类只是添加了一些附加成员函数并在内部进行了一些花哨的内存管理的结构体。但是,如果API应该返回一个结构体,则在无法创建结构体时返回NUL通常是惯例。 - Rob Wells

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接