是否存在关于在方法签名中返回布尔值以指示成功操作而不是声明void的任何硬性规则和快速规则?我发现,对于我的调用方法中的更关键操作,我想知道操作是否已完成,因此我可以记录任何问题。这是布尔的“不恰当”使用吗?
答案 0 :(得分:22)
通常我会在出现问题时使用Exception
来发出信号。
您可以false
throw
而不是返回Exception
,并提供有关问题原因的详细信息。
返回false
并没有提供有关此问题的更多信息。
然后,如果您希望方法很容易失败,那么只需将方法调用放在false
/ try
中,而不是检查catch
返回值。
很多人会抱怨这种方法比较慢。但是,你获得的好处大大超过了减速。此外,如果你使用Java速度不应该是你的第一关注。
答案 1 :(得分:6)
我通常发现在失败的情况下抛出异常是一个比返回布尔值更好的解决方案,因为通常不关心进程是否成功 - 我只关心它是否失败。通过使用异常,我可以提供有关进程实际失败原因的任何数量的信息。
如果异常看起来令人反感,您可以返回一个包含布尔值和状态消息的自定义Status对象(类似于“添加6个新Foobars!”或“无法添加Foobars因为Foobin已满!”),尽管如此当然更复杂。
答案 2 :(得分:4)
仅在明确某些事物具有布尔结果的情况下才这样做。像IsValidCustomer()
或其他一样。
对于你想想的所有其他事情你可以介绍它,这可能意味着你正在处理某种Exception
,你真的不想用它来包装它一个简单的布尔true/false
,因为你可以有各种各样的口味(不同的例外)和出错的原因,你可能想知道。
因此要么让异常冒泡到堆栈中,要么抓住它并将其转换为自定义异常或记录它或其他任何内容。
答案 3 :(得分:2)
使用布尔值表示非异常的失败结果。一个例子是搜索功能。名义上的失败将是 not-found 。用异常来传达这种结果是笨拙的。保存特殊情况的例外情况; not-found 和之间的区别无法搜索。
答案 4 :(得分:1)
这是一个好的范例,但是如果你想强制调用者处理这个案例,那么操作没有成功完成,你可能想要抛出一个检查过的异常。
但是,这种模式确实发生在核心Java库中。请参阅File.delete()作为示例。
答案 5 :(得分:1)
一般来说,为了获得成功,你所看到的是:
在成功返回布尔值时看不到任何错误,除非您需要有关异常行为的信息。
答案 6 :(得分:1)
如果出现意外结果,请抛出异常。 如果你只是想让函数告诉你“我做了X”,那么返回一个布尔值。
答案 7 :(得分:1)
在实践中,我发现当失败意味着我们需要中止该过程时,抛出异常是最好的办法。比如,如果您正在尝试处理订单 - 向客户收费,安排运输,支付销售税等 - 如果您无法找到订单记录,那么完成所有其他工作可能没什么意义。你只想离开那里。例外情况可让您轻松完成此操作。只需抓住块的底部,显示或记录错误,然后离开。
另一方面,如果“错误”意味着我的程序采用不同的流路径,则返回布尔值更有意义。就像,如果我正在寻找一个特定的客户,如果他存在我更新他的记录,如果他不是我创建一个新的客户记录,那么返回一个布尔值很有意义,并在调用者测试它如果是真的,则按照一条路径,当为假时,按照另一条路径。
实际上这是“错误”这个词的两个非常不同的含义,它们需要不同的处理。很可能同一个功能可以做到这两点。就像,在发现返回true时,on not found返回false,在尝试读取I / O错误时抛出异常。
答案 8 :(得分:0)
看起来不错,但魔鬼在于细节。 ; - )
抛出异常是主要的选择,有利有弊。
我认为您可以通过提供精确的编码样本来获得更多洞察力......