在Java中自我检查null是否有意义

时间:2012-01-26 13:11:04

标签: java coding-style null nullpointerexception

我经常看到java SourceCode,其中不允许将null作为方法或构造函数的值。典型的实现方式如下

public void someMethod(Object someObject){

    if(someObject == null) throw new NullPointerException()

    someObject.aMethodCall()

}

我觉得自己完全没有意义,因为如果我尝试在nullPointer上调用一个方法,那么无论如何都会抛出NullPointerException。我会看到这种方法是否会抛出IllegalArgumentException或其他一些自定义异常。有人可以澄清一下,为什么这个检查似乎有意义(因为我经常看到我认为,这背后必须有意义),或者为什么它完全是无稽之谈

9 个答案:

答案 0 :(得分:9)

你发布的代码完全没有任何意义。它看起来像cargo cult programming的强大案例。最有可能的是,有人实施了一个有用的测试来检查前置条件一次,而其他人则将测试调整为这样。

答案 1 :(得分:6)

有一个角落的情况下,这样的事情是有道理的。如果不立即使用someObject,则将错误情况短路到函数的开头可能很有用。

public void someMethod(Object someObject){

    if(someObject == null) throw new NullPointerException();

    expensiveOperationNotUsingSomeObject();

    someObject.aMethodCall();
}

答案 2 :(得分:5)

不,这并没有多大意义,只是因为投掷NPE不会添加任何有用的信息。

您可以通过抛出(例如)IllegalStateException:

来使错误更好
if (someObject == null) throw new IllegalStateException("someObject was null");

但这并没有增加很多价值 - 除了具体的什么是null(在更复杂的方法中可能有用)

答案 3 :(得分:5)

当然你要检查null。这是您的方法的先决条件,是与客户签订合同的一部分。如果您的方法无法接受空输入,则需要强制执行该操作。

异常的选择可能会更好。我通常选择IllegalArgumentException

如果这种方法的简洁困扰着你,我不得不说我同意。那里没有新信息。

答案 4 :(得分:4)

这取决于谁有责任从这种情况中恢复。如果是来电者,请抛出一个NPE。如果它是被调用的方法,请测试null并执行解决此情况所需的任何操作。

编辑:不要明确地抛出NPE,而是让它冒泡。对于模糊的措辞感到抱歉。

答案 5 :(得分:2)

根据以下假设之一,您描述的情况可能很有用:

1。)如果你必须执行一些代价高昂的操作或者在执行someObject.aMethodCall()之前改变一些全局状态,你可以防止回滚代码和浪费执行周期。

2.如果someObject存储在数据结构中,如果稍后从数据结构中检索数据,则可能会产生可能的陷阱。我想,我记得java集合框架中的一些类,它们抛出了一个NPE而不是允许null进入存储结构。

答案 6 :(得分:2)

就个人而言,我永远不会将NullPointerException作为公共API方法的一部分抛出的原因是因为它使程序员更难以区分他们的编程错误和我的代码中的错误(即我故意让NPE被抛出?)。

抛出一个不同的异常会使意图更清晰,也有助于程序员更容易找出错误。所以我会去那里IllegalArgumentException

如果是一些内部方法?我会使用断言或让它崩溃。明确抛出NPE imo没有任何意义。

答案 7 :(得分:0)

我认为,如果某个方法在实际触发NPE之前执行需要花费大量时间或难以撤消的处理,那么进行此类检查是有意义的。在给出的例子中,我认为它没有实际意义。

另一方面:使用assert或抛出更具体的异常(如IllegalArgumentException)可能更有意义。

答案 8 :(得分:0)

在C#中存在ArgumentNullException。此异常采用构造函数中的参数名称。所以调用者可以看到,哪个参数可能是非法的NULL。 IllegalArgumentException几乎与Java等效。