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

标签 java null nullpointerexception

正如标题所说,我想知道关于抛出 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/

相关文章:

java - "? extends ParentClass"使只读?

swift - 从类外部更新时,UILabel 在解包可选值时意外发现 nil

java - 什么是NullPointerException,我该如何解决?

java - 使用 JSON 插入排序时遇到问题

javascript - 使用未定义和 null 的 Object.prototype.toString 函数

java - iText 中用于生成 PDF 的基本模板

java - CDI @inject 空指针

java - JSF + hibernate : Collection is not associated with any session

java - FileInputStream 抛出 NullPointerException

java - EasyMock 能否支持将多个重载方法添加到 createMockBuilder