Tho*_*asH 11 java null nullpointerexception
正如标题所说,我想知道关于抛出NullPointerExceptions的最佳实践是什么.具体来说,如果我有一个外部库函数,可以null在我不想实际处理的情况下返回(参见下面的具体示例),因为它null表示软件有问题.问题是,我应该
null并自己抛出NullPointerException,或者第一种方法让我添加一些额外的信息,因为我构建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();
Run Code Online (Sandbox Code Playgroud)
Central.createSynthesizernull如果找不到合适的合成器,则返回,这通常是由于缺少speech.properties文件引起的.所以这是系统设置错误的问题,而且在运行时很难恢复,而不是需要以编程方式处理的情况.因此,我认为抛出NullPointerException是一个有效的响应,因为它表示一个错误(不在代码中,而是在软件的部署中).但是由于该synthesizer对象在下一个语句中被解除引用,我应该让JVM为我抛出NPE并保存null检查吗?
附录:考虑到当(通常)"user.home"或"java.home/lib"中的文件系统上存在需要存在JVM启动时才加载 speech.properties ,令人费解的是createSynthesizer不会直接抛出NPE(这是我最初在弗洛伊德语中写的,当它找不到它但返回null时.我认为抛出NullPointerException是正确的做法,因为它表明了软件部署中的实际错误.
我要说你永远不应该明确地创建一个NullPointerException而是使用更清楚地描述情况的异常类型.在你的情况下,我会说IllegalStateException适合"系统的错误设置,并且在运行时很难恢复"的情况.或者你可以创建自己的ComponentMissingException.在一个所需的方法的参数是的情况下null,IllegalArgumentException典型地使用.
在你的情况下:既不是.检查null并抛出更有意义的异常,而不是NPE.
一般情况下 - 如果NPE不应该发生,不要明确地测试它,Java会为你做.编写的测试较少,读取的代码较少,分析的复杂性较低.
但是,如果null预计会尽快测试并相应地解释.否则NullPointerException将在稍后的某个地方以不同的行/方法发生,这使得调试真正的问题变得更加困难.
| 归档时间: |
|
| 查看次数: |
7009 次 |
| 最近记录: |