我应该显式抛出一个NullPointerException还是让Java为我做这件事?
正如标题所说,我想知道抛出NullPointerExceptions的最佳实践是什么。具体来说,如果我有一个外部库函数,它可以在我不想实际处理的情况下返回(请参阅下面的特定示例),因为这表明软件存在问题。问题是,我应该null
null
- 检查的返回值并自己抛出 NullPointerException,或者
null
- 我应该让Java在我试图使用对象时立即为我做肮脏的工作。
第一种方法允许我添加一些额外的信息,因为我可以构造NullPointerException,但在我看来,第二种方法使代码更清晰。我还想知道任何性能影响,也就是说,Java在“本机”抛出NPE方面是否更有效?
例如,我正在尝试使用以下代码使用 Java 语音 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
如果找不到合适的合成器,则返回,这通常是由缺少 speech.properties 文件引起的。因此,这是一个系统设置错误的问题,并且从运行时就无法恢复,而不是需要以编程方式处理的情况。因此,我相信抛出NullPointerException是一个有效的响应,因为它表示一个错误(不是在代码中,而是在软件的部署中)。但是,由于对象在下一个语句中被取消引用,我是否应该让JVM为我抛出NPE并保存空检查?null
synthesizer
补遗:考虑到当JVM启动时,speech.properties被加载,需要存在于文件系统上(通常)“user.home”或“java.home/lib”中,令人费解的是,当它无法找到它但返回null时,它不会直接抛出NPE(这是我最初在弗洛伊德的滑移中写的)。我认为抛出一个NullPointerException在这里是正确的做法,因为它表明了软件部署中的实际错误。createSynthesizer