是抛出异常还是返回null更具Java-thonic?

时间:2014-07-16 14:54:32

标签: java json error-handling nullpointerexception

我有一个不幸的Java库,我已经继承了解析JSON。现在,如果你要求一个在JSON数组中不存在的密钥,它就会以空指针消亡。我要编辑库以做更合理的事情。我想我有两个选择:

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

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

我来自python背景,我被强烈吸引到2号,看到它将确保某些骨头不能调用此函数然后继续使用空值,稍后崩溃他们的应用程序并可能损坏数据。您认为哪种方式更符合 Java 的最佳做法?这不是关于同一主题的其他与语言无关的问题的重复。这特别是在Java !!!!

的上下文中

5 个答案:

答案 0 :(得分:7)

取决于。

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

这里的关键字是"可以"。调用者可以完全忽略空值。如果这完全没问题,那么返回null就可以了。

抛出异常,以便来电者必须检查

关键字是"必须"。如果您认为调用者需要处理这种情况,则可以选择此选项。

抛出未经检查的异常,以便来电者可以检查

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

答案 1 :(得分:3)

这是一个深奥的问题!

传统观点是: -

  

不要使用控制流的例外。当异常发生时,应该留下例外

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

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

简而言之,由于Java的异常系统非常灵活,有时会抛出异常并使用它们来控制程序流,因此可以成为使程序逻辑更具可读性和可维护性的合理方法。

答案 2 :(得分:1)

抛出异常。它明确解释了已发生的错误,并允许程序以优雅的方式处理它。如果您以正确的方式处理这些异常(不仅仅是捕获异常并且不执行任何操作),这样做的好处就是更难以忽略程序中发生的错误。

答案 3 :(得分:0)

我总是尝试抛出异常,以便编码器可以很容易地看到预期的内容,但我可以看到它是程序员偏好。

如果你想返回空值,我建议返回Null对象,以避免可怕的空指针异常,这些异常可能会困扰代码并强制编码器不断进行空检查,因为它们永远无法确定某些东西是否返回null

答案 4 :(得分:0)

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

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

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