Java:检查null或允许异常处理

AJa*_*Jay 11 java

我想知道使用try/exception处理空值的成本与使用if语句首先检查空值相比.

提供更多信息.获得空值的概率大于50%,因为在这个应用程序中.如果没有输入数据,则通常为null ...因此尝试使用null计算是常见的.

这就是说,如果我在计算之前使用if语句首先检查null并且不首先尝试计算,或者只是抛出异常并处理它,那么它会提高性能吗?

谢谢你的任何建议:-)

感谢您提供极好的发人深省的反馈!这是一个PSEUDOcode示例,用于澄清原始问题:

BigDecimal value1 = null //assume value1 came from DB as null
BigDecimal divisor = new BigDecimal("2.0");

try{
    if(value1 != null){ //does this enhance performance?... >50% chance that value1 WILL be null
        value1.divide(divisor);
    }
}
catch (Exception e){
    //process, log etc. the exception
    //do this EVERYTIME I get null... or use an if statement
    //to capture other exceptions.
}
Run Code Online (Sandbox Code Playgroud)

duf*_*ymo 17

我建议检查null并不进行计算而不是抛出异常.

异常应该是"例外"且很少见,而不是管理控制流的方法.

我还建议您与客户就输入参数建立合同.如果允许空值拼写出来; 如果它们不是,请明确应该传递的内容,默认值以及如果传递空值则保证返回的内容.


Bal*_*usC 11

如果传递null参数是一个例外情况,那么我会抛出一个NullPointerException.

public Result calculate(Input input) {
    if (input == null) throw new NullPointerException("input");
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果传递null允许的情况,那么我将跳过计算并最终返回null.但这在我看来没有多大意义.传递null第一个实例似乎是调用代码中的错误.

无论您选择哪种方式,都应该在Javadoc中正确记录,以避免API用户出现意外情况.

  • @seh:`IllegalArgumentException`仅适用于非"null"的非法参数.编辑:正如@poly所说,是的:)在Java SE/EE API中查看,你会看到这个约定也适用于那里. (2认同)

Tof*_*eer 5

尝试和捕捉接近于“免费”,但抛出可能非常昂贵。通常 VM 创建者不会优化异常路径,因为它们是异常的(应该很少见)。

NullPointerException 表示程序员错误 (RuntimeException),不应被捕获。与其捕获 NullPointerException,不如先修复您的代码,以免引发异常。

更糟糕的是,如果您捕获 NullPointerException 并且计算代码的不同部分抛出 NullPointerException 而不是您期望抛出的部分,那么您现在已经掩盖了一个错误。

为了完全回答你的问题,我会以一种方式实现它,对其进行分析,然后以另一种方式实现它并对其进行分析......然后我只会使用带有 if 语句的那个​​,避免抛出 NullPointerException,无论哪种方式更快仅仅因为上面的一点。