为什么在参数为null时抛出NullPointerException?

时间:2016-05-12 21:37:52

标签: java c# nullpointerexception null

我在Stackoverflow上多次看到这段代码:

public void doStuff(Object anObject) {  
    if (anObject == null) {  
        throw new NullPointerException("anObject can't be null");   
    }  
    //rest of the function
}

这是针对null参数的保护子句,因为将null传递给需要参数为非null的函数将导致NullPointerException

我理解保护条件在其他情况下验证参数的重要性(即检查日期范围,负货币值,无效字符串大小等)。

但是,如果null 具体,则不会使NullPointerException多余?这与让运行时稍后抛出NullPointerException本身有何不同?

注意:我用语言无关的方式询问,因为模式本身可以应用于Java和C#。

3 个答案:

答案 0 :(得分:7)

由于这个问题有C#标签,我将回答有关C#的案例。在这种情况下,访问空指针时抛出的是NullReferenceException,并且当参数为null时通常抛出的是ArgumentNullException。但更重要的是,当你明确地检查参数时,你:

  1. 当您突然访问空指针时,尽快抛出异常,而不是在方法中间的某处。
  2. 你明确地说什么是null。在C#中,至少在NullReferenceException抛出的时候,你会猜测究竟是什么,以及在哪里。

答案 1 :(得分:4)

唯一的区别是它何时发生。在代码开始修改状态之前,有时可能需要提前抛出异常,如果在中间抛出异常,则可能无效。 那就是说,抛出一个NullPointerException似乎是不好的做法;抛出IllegalArgumentException会更好。编辑:根据下面的评论,NullPointerException是推荐的例外情况,至少在Java中是这样。

答案 2 :(得分:1)

这有助于尽快检测错误。该方法可能不会抛出空指针异常(取决于代码的逻辑),并且null对象可能在其他方法/代码中的其他地方传播并在那里抛出异常,或者更糟糕的是它可能导致错误的结果,从而导致一个无声的bug可能会把它变成最终的代码......

从Effective Java Second Edition中提取

  

如果将无效参数值传递给方法和方法   在执行之前检查其参数,它将很快失败   干净利落地适当例外。如果方法无法检查   它的参数,可能会发生几件事。该方法可能会失败   在处理过程中有一个令人困惑的例外。更糟糕的是   方法可以正常返回但是默默地计算错误的结果。   最糟糕的是,该方法可以正常返回,但留下一些对象   在一个受损的状态下,在某个不相关的点导致错误   未来某个未定时间的代码。