抛出异常或返回 null 是不是更适合 Java? [复制]

Posted

技术标签:

【中文标题】抛出异常或返回 null 是不是更适合 Java? [复制]【英文标题】:Is it more Java-thonic to throw an exception or return null? [duplicate]抛出异常或返回 null 是否更适合 Java? [复制] 【发布时间】:2014-09-07 04:07:29 【问题描述】:

不幸的是,我继承了一个解析 JSON 的 Java 库。现在,如果你请求一个 JSON 数组中不存在的键,它会以一个空指针而死。我将编辑库以做一些更合理的事情。我想我有两个选择:

1) 返回 null 以便调用者可以检查

2) 抛出一个更明确的异常(比“Null Pointer”更具描述性),强制调用者处理他们要求不存在密钥的情况。

我来自 python 背景,非常喜欢数字 2,因为它会确保某些傻瓜无法调用此函数,然后继续使用空值,稍后会导致其应用程序崩溃并可能损坏数据。您认为哪种方式更符合 Java 的最佳实践?这不是同一主题的其他与语言无关的问题的重复。这特别是在 Java 的上下文中!!!!

【问题讨论】:

2 号是您最好的选择。你不希望人们四处寻找永远寻找错误...... 这是在特定于 Java 的上下文中 真的很难回答。如果你是一个纯粹主义者,当它不是异常状态时,你不应该抛出异常。如果某些东西不存在是完全可以的(并且你最终得到一个空引用),那么你不应该抛出异常。 @ErlVolton,是的,但这个问题与语言无关......更多的是设计哲学问题...... 从 Java 8 开始,您还可以返回一个 Optional,如果密钥不存在,则该 Optional 为空。 【参考方案1】:

视情况而定。

返回 null 以便调用者可以检查

这里的关键词是“可以”。调用者可以完全忽略空值。如果这完全没问题,那么返回 null 也没问题。

抛出异常以便调用者必须检查

关键字是“必须”。如果您认为呼叫者需要处理这种情况,可以选择此选项。

抛出未经检查的异常,以便调用者检查

如果你这样做,那么你一定是非常刻意的。基本上,如果确实出错了,这可以让调用者确切知道出了什么问题,但您不一定认为他们需要(或者甚至能够)处理问题。

【讨论】:

第二部分可能需要有一个小小的警告,取决于它是检查还是未检查的异常,无论如何都是“必须”的。 @nerdwaller 我认为 Java 将强制您捕获或声明由您正在调用的函数声明的异常。例如。如果 getWhatever 后面有“throws MyException”,并且您正在调用 getWhatever,编译器将强制您将其包装在 try 块中或声明您也“thows MyException”。 实际上,抛出异常并不会强制调用者检查任何内容,他可以像使用null 一样简单地忽略异常。除了写更多的行来捕捉它,在那之后,忽略它是很有可能的。 @ErlVolton - 这不是真的。未经检查的异常扩展 RuntimeException 并且方法没有义务说它抛出,大多数 IDE 也没有说你需要捕捉它。检查扩展异常,它要求您在方法上声明 throws,并且 IDE 会大喊您需要捕获它。但从技术上讲,JonathanDrapeau 是正确的,您可以忽略它,但要这样做,您需要仔细考虑您的工作和编译方式,以免看到编译错误。 @nerdwaller 我想我抓住了这条评论链的精髓。如果您认为它有问题,请告诉我(特别是最后一句话,这是我自己对未经检查的异常的理解)。【参考方案2】:

这是一个深奥的问题!

传统观念是这样的:-

不要对控制流使用异常。例外应该留到有异常发生的时候

这意味着返回一个 NULL 并检查它。即选择(1)

但是here is an interesting discussion on this very subject 在 Java 语言的上下文中。

简而言之,由于 Java 的异常系统非常灵活,有时会抛出异常并使用它们来控制程序流程,这可能是使程序逻辑更具可读性和可维护性的明智方式。

【讨论】:

我接受了这个答案,因为它与 Java 直接相关,这是问题的本质。谢谢!【参考方案3】:

抛出异常。它对已发生的错误给出了明确的解释,并允许程序以优雅的方式处理它。如果您以适当的方式处理这些异常,这样做的好处是更难不知道程序中发生的错误(因此,不仅仅是捕获异常并且什么都不做)。

【讨论】:

【参考方案4】:

我总是尝试抛出异常,以便编码人员可以轻松看到预期的内容,但我可以看到这是程序员的偏好。

如果你想返回空值,我建议返回空对象以避免可怕的空指针异常,这些异常会困扰代码并迫使编码人员不断地检查空值,因为他们永远不确定某些东西是否返回空值

【讨论】:

【参考方案5】:

在这两个选项中,我会抛出一个异常,这是一种异常情况(用户正在请求不存在的东西),我认为这是正确的做法。 Some 会同意,others 以及“清洁代码”...debatably。

返回 null 是不好的做法 - 我认为 - 因为它只会导致方法/类的用户不得不处理可能会被遗忘的 null 并且只会向上传播 null 指针。 Some would say 这是正确的做法。

在某些情况下,另一种选择是返回一个空对象,避免使用 NullPointerException 并且不完全将其归类为异常情况,但我不确定这是否适用于此。

【讨论】:

以上是关于抛出异常或返回 null 是不是更适合 Java? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java 和 SQL:返回 null 还是抛出异常?

Find() 和 First() 抛出异常,如何改为返回 null?

返回空数组和集合而非 null

Java:初始化错误的适当异常

Java异常详解

Java必知必会:异常机制详解