繁体   English   中英

是否检查null

[英]Whether to check for null

我知道你应该总是检查传入的params到null的方法。 但是,如果我有一个try / catch引用局部变量的情况怎么办? 我真的需要在下面检查空吗? 因为无论如何它都会捕获它,如果它为null并且下一行代码试图使用refundResponse变量:

    public string DoRefund(...)
    {
        try
        {
    ......
            string refundTransactionID = string.Empty;
    ......

            RefundTransactionResponseType refundResponse = transaction.DoRefund(...);

            if (refundResponse != null)
                refundTransactionID = refundResponse.RefundTransactionID;
    .....
        }
        catch (Exception ex)
        {
            LogError(ex);
            return ex.ToString();
        }
    }

请记住,我正在专门讨论局部变量并检查方法中的那些变量,而不是方法的传入参数。

我在这里要求的是我在设置refundTransactionID之前是否需要检查null,或者我只是设置它而不假设编译器将处理并抛出如果它为null将被捕获并作为字符串返回到在这种情况下打电话。

或应该是

if (refundResponse == null)
                return null;

或者只是完全检查这个局部变量赋值然后因为在这种情况下我有一个try / catch我正在处理编译器选择的任何异常,通过将异常作为字符串返回给调用者(它不是我决定寄回一个字符串,这是我老板的要求......所以现在绕过那个辩论):

 refundTransactionID = refundResponse.RefundTransactionID;

最终,该方法中的其他代码依赖于有效的refundTransactionID。

例外情况适用于特殊情况。 如果您可以检查可持续错误,请执行此操作!

我知道你应该总是检查传入的params到null的方法。

不,不一定。 您应该指定的是您的方法的合同 指定您将为null参数抛出NullPointer / NullReferenceException是完全可以接受的(也是常见的)。 那你就不需要任何检查了。

您也可以检查null,但这只有在您实际可以有效处理空值时才有意义(例如,替换默认值)。

您应该在该实例中检查null。 您的应用程序逻辑应该能够处理这些情况,而不需要例外。

测试的替代方案是Null Object模式 事务:: DoRefund()方法返回一个空对象,而不是返回Null或有效事务,该对象提供与RefundTransactionResponseType实例相同的接口,但其方法不执行任何操作。 有了这个,就没有必要测试是否为Null。

应该明智地使用,因为这可以很容易地隐藏问题。

不,你不需要检查null。 这开辟了另一个问题,但是,你真的需要检查传入参数中的null吗?

记住:这是一种行为。 你必须测试那种行为。

但是,如果你不能继续在那一点让异常传播。

不,看起来你不应该在这里检查null。 而且我也不会检查所有传入参数的null(如您的描述所示)。

您将transactionID作为字符串或异常消息返回也很奇怪。 如果发生异常,此方法的调用者将如何知道?

如果你真的想记录异常,那么这样的事情怎么样:

    public string DoRefund(...) 
    { 
        try 
        {
            return transaction.DoRefund(...).RefundTransactionID; 
        } 
        catch (Exception ex) 
        { 
            LogError(ex); 
            throw ex;
        } 
    }

您应检查null,而不是让异常处理处理它。 正如leppie所说,例外是针对特殊情况而非正常的控制流程。 如果您知道可能发生的问题,那么您应该优雅地处理它们。

另外要记住的是异常的性能影响。 抛出异常时,JVM必须展开调用堆栈。 在您的示例中,还会记录异常。 所有这些都需要时间,并且比简单的“if”检查慢得多。

我建议检查null然后进行某种软错误处理,而不是让它捕获并抛出错误消息。

这取决于它对程序的意义(refundResponse == null)。 如果这有一些意义,那么报告更多信息性错误是有意义的。 如果它永远不会发生并且会在DoRefund方法中指出一个缺陷,那么我认为允许null稍后引发异常是好的。 在后一种情况下,如果您对该方法持怀疑态度以及它是否符合预期,我只会进行特定检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM