我有一个不幸的Java库,我已经继承了解析JSON。现在,如果你要求一个在JSON数组中不存在的密钥,它就会以空指针消亡。我要编辑库以做更合理的事情。我想我有两个选择:
1)返回null,以便调用者可以检查
2)抛出一个更明确的异常(比" Null Pointer"更具描述性),迫使调用者处理他们要求不存在密钥的情况。
我来自python背景,我被强烈吸引到2号,看到它将确保某些骨头不能调用此函数然后继续使用空值,稍后崩溃他们的应用程序并可能损坏数据。您认为哪种方式更符合 Java 的最佳做法?这不是关于同一主题的其他与语言无关的问题的重复。这特别是在Java !!!!
的上下文中答案 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
而不是将其归类为异常情况,但我不确定是否适用于此。