在Java中,返回布尔类型而不是声明void类型?

14

有没有关于在方法签名中返回布尔值以指示成功操作的硬性规定,而不是声明void的规定?我发现对于我的调用方法中更为关键的操作,我想知道是否完成了某个操作,以便记录任何问题。这是使用布尔值的“不适当”用法吗?

有关在方法签名中返回布尔值或声明void来指示成功操作是否存在硬性规定,目前没有。在一些情况下,将布尔值用于表示操作的成功或失败可能不太合适。但是,如果您需要在调用方法中记录任何问题,则返回布尔值可能是一个好选择。
9个回答

22

通常我使用Exception来表示出现了问题。

与其返回false,不如抛出一个带有详细信息的Exception,说明出了什么问题。

返回false并不能提供太多关于问题的信息。

然后,如果你预计方法可能会失败,就不要检查false的返回值,而是将方法调用放在try/catch中。

许多人会抱怨这种方法较慢。但是,你所获得的好处远大于减速。此外,如果你使用Java,速度不应该是你的首要考虑因素。


1
异常应该是非常罕见的。因此,速度差异应该是显著的。 - Lawrence Dol

6

通常情况下,如果出现失败,抛出异常比返回布尔值是更好的解决方案,因为通常我并不关心进程是否成功,我只关心进程是否失败。通过使用异常,我可以提供任意数量的关于进程失败原因的信息。

如果异常看起来让人不舒服,你可以返回一个自定义的状态对象,其中包含布尔值和状态消息(例如“添加了6个新Foobars!”或“无法添加Foobars,因为Foobin已满!”),不过这当然更加复杂。


4
只有在某些情况下,明确某个事物具有布尔结果时才这样做,例如IsValidCustomer()之类的情况。
对于其他所有需要引入此功能的事物,这可能意味着您正在处理某种异常,并且您真的不想将其与简单的布尔true/false一起包装,因为可能会出现各种口味(不同的异常)和原因导致出错,您希望了解其中的原因。
因此,请让异常上升到堆栈中,或者捕获它并将其转换为自定义异常或记录下来。

2

使用布尔值表示非异常的失败结果。例如,搜索功能的标准失败结果是“未找到(not-found)”。用异常来传达这种结果很不方便。将异常保留给特殊情况;区分“未找到”和“无法搜索(cannot-search)”。


1

这是一种可以的范例,但如果你想强制调用者处理操作未能成功完成的情况,你可能会想要抛出一个 checked 异常。

这个模式在 Java 核心库中确实存在。比如 File.delete()


-1:这不是一个“OK”的范例;这是一种错误后“瞎搞”的可怕灾难制造方式。 - Lawrence Dol
1
我认为你将会面临很多的负评。 - danben

1

通常情况下,返回成功的方法有以下几种:

  • 返回布尔值
  • 返回 void,但在出现错误时抛出异常
  • 返回状态码(在 Java 中较少见)。

如果您需要了解异常行为的信息,那么返回布尔值表示成功是没有问题的。


返回布尔值表示成功的(潜在)问题在于,人们可以很容易地忽略失败的布尔值。即使是运行时异常,在编码和测试期间也更容易被注意到并且更加明显。 - ILMTitan

1

如果出现意外的结果,抛出异常。 如果你只想让函数告诉你“我是否做了X”,那么返回布尔值。


1

在实践中,当失败意味着我们需要中止进程时,我发现抛出异常是最好的选择。例如,如果您正在尝试处理订单——向客户结算、安排运输、支付销售税等等——如果找不到订单记录,那么做所有其他工作可能没有多大意义。你只想走人。异常能让你轻松实现这一点。只需在块底部捕获异常,显示或记录错误,然后退出。

另一方面,如果“错误”意味着我的程序采用了不同的流程路径,则返回布尔值更有意义。例如,如果我正在寻找特定的客户,并且如果他存在,则更新他的记录,如果不存在,则创建一个新的客户记录,那么返回布尔值就很有意义,在调用者测试它并在为真时遵循一条路径,在为假时遵循另一条路径。

实际上,“错误”这个词有两种非常不同的含义,需要不同的处理方式。同一个函数完全可以同时处理两种情况。例如,当找到时返回true,在未找到时返回false,在尝试读取时发生I/O错误则抛出异常。


0

看起来还不错,但细节决定成败。 ;-)

抛出异常是主要的替代方案,有好处也有坏处。

我认为您可以通过提供精确的编码示例来获得更多的见解...


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