4

我使用商业 API 并且有一个NullpointException来自 API 代码。

支持人员告诉我这是预期的,因为我调用的方法的输入参数之一是null,并且需要此参数才能使用方法。

这真的是我的错吗,因为我在将参数传递给 API 之前没有检查它们?

NullpointerExceptions释放你的 API不是不好的做法吗?RuntimeExceptions如果不是,如果我想确保我的软件不会崩溃,我将不得不检查是否使用该 API 的方法。

如果这是不好的做法,是否有任何文件或规范提到这一点?

4

3 回答 3

5

是的,我会说他们应该扔IllegalArgumentException

请参阅:空参数的 IllegalArgumentException 或 NullPointerException?

请继续阅读,因为这是最好的答案:https ://stackoverflow.com/a/47710/2586804

主要区别在于IllegalArgumentException明确表明在使用该库时犯了一个错误。

无论哪种方式,您只需要正确使用该库即可。并且只有在可以处理它们的情况下才捕获异常。

于 2013-09-18T09:37:14.917 回答
4

你说你必须检查 all RuntimeExceptions。答案是否定的!如果使用错误的方式,API 可以抛出未经检查的运行时异常(无论是 a NullPointerException、 aIllegalArgumentException还是其他)。

在您的情况下,您以错误的方式使用 API,因此您得到了一个NullPointerException. 如果你想抓住它,你的代码会是什么样子?

try {
    useAPI();
} catch(NullPointerException e) {
    useAPIcorrectly();
}

为什么不这样做useAPIcorrectly();呢?;-)

您可以将一些调试输出放在用于开发的 catch 块中,但同样:如果在开发中,a 的堆栈跟踪NullPointerException也足以用于调试。然后,您会将其修复为正确的 API 使用,并且再也不会看到这些异常 :-)

于 2013-09-18T10:10:43.480 回答
2

这真的是我的错吗,因为我在将参数传递给 API 之前没有检查它们?

是的。API 定义了如何正确使用它的合约。如果需要一个值但未传入,我完全希望 aRuntimeException回来。在尝试使用 API 之前,您应该对数据进行验证,以确保提供所需的数据。正如stonedsquirrel 所说,您不应该捕获RuntimeException。

于 2013-09-18T11:18:04.343 回答