gpt4 book ai didi

java - 我应该显式抛出 NullPointerException 还是让 Java 为我做这件事?

转载 作者:搜寻专家 更新时间:2023-10-30 21:21:51 25 4
gpt4 key购买 nike

正如标题所说,我想知道关于抛出 NullPointerExceptions 的最佳实践是什么。具体来说,如果我有一个外部库函数可以在我不想实际处理的情况下返回 null(请参阅下面的特定示例),因为 null表示软件有问题。问题是,我应该

  1. 检查 null 的返回值并自己抛出 NullPointerException,或者
  2. 我是否应该让 Java 在我尝试使用该对象时立即为我做这些肮脏的工作。

第一种方法让我可以添加一些额外的信息,因为我要构造 NullPointerException,但在我看来,第二种方法可以使代码更清晰。我还想知道任何性能影响,也就是说,Java 在“本地”抛出 NPE 时是否更有效?

例如,我正在尝试使用 Java Speech API 通过以下代码创建语音合成器:

synthesizer = Central.createSynthesizer(generalDesc);

if (synthesizer == null) {
// (1) throw NPE explicitly
throw new NullPointerException("No general domain synthesizer found.");
}

// (2) let the JVM throw the NPE when dereferencing
synthesizer.allocate();

Central.createSynthesizer 如果找不到合适的合成器,则返回 null,这通常是由于缺少 speech.properties 文件引起的。因此,这是系统设置错误的问题,并且在运行时几乎无法恢复,而不是需要以编程方式处理的情况。因此,我认为抛出 NullPointerException 是一个有效的响应,因为它表明存在错误(不是在代码中,而是在软件部署中)。但是由于 synthesizer 对象在下一个语句中被取消引用,我是否应该让 JVM 为我抛出 NPE 并保存 null 检查?

附录:考虑到 speech.properties 在 JVM 启动时加载 需要存在于(通常)“user.home”或“java.home”中的文件系统中/lib”,令人困惑的是 createSynthesizer 在找不到 NPE 时并没有直接抛出 NPE(这是我最初在弗洛伊德式的单据中写的)而是返回 null。我认为在这里抛出 NullPointerException 是正确的做法,因为它表明软件部署中存在实际错误。

最佳答案

在你的情况下:两者都不是。检查 null 并抛出更有意义的异常,而不是 NPE。

一般来说——如果 NPE 不应该发生,不要明确地测试它,Java 会为你做。编写的测试更少,读取的代码更少,分析的复杂性更低。

但是,如果希望null 尽快对其进行测试并进行相应的解释。否则 NullPointerException 将在稍后的不同行/方法中发生,使得调试真正的问题变得更加困难。

关于java - 我应该显式抛出 NullPointerException 还是让 Java 为我做这件事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com