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

Erl*_*ton 4 java error-handling json nullpointerexception

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

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

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

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

Rai*_*olt 7

这取决于.

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

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

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

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

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

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

  • @ErlVolton - 那不是真的.未经检查的异常扩展[RuntimeException](http://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html)并且方法没有义务说它抛出,大多数IDE也没有说你需要抓住那个.检查扩展异常,它要求您声明对方法的抛出,并且IDE会对您大喊大叫,您需要捕获它.但从技术上讲,JonathanDrapeau是正确的,你可以忽略它,但要做到这一点,你需要慎重考虑如何工作和编译,看不到编译错误. (2认同)

Gee*_*eeb 3

这是一个深奥的问题!

传统观点是这样的:-

不要使用异常来控制流程。发生异常情况时应留有例外

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

但这里有一个关于Java 语言背景下这个主题的有趣讨论。

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