必须在哪里检查参数

时间:2015-09-16 11:31:00

标签: java

在我的java代码中,我需要在另一个内部调用一个方法。传递给suspendUserTestList的参数不得为null。所以非常简单的问题是我必须检查null的情况:在传递值之前还是在第二种方法中?

以下是我的方法:

public String suspendTest(Integer locationId, Integer userId) {
    testManager.suspendUserTestList(userTestList, SUSPENDED_TEST_FREQUENCY, usersTestsSuspenSession);
}

public void suspendUserTestList(List<UserTest> userTestList, Integer frequency, Session session) throws MonitorUsException {
    if (userTestList == null) {
        throw new MonitorUsException("Error");
    }
}

5 个答案:

答案 0 :(得分:2)

简短回答取决于

答案很长.......

在查看方法实现之后,如果它是null,则抛出异常。因此,您必须在检查以接收该异常之前调用该方法。

如果在调用方法之前检查,则不会收到任何异常,它只是跳过对该方法的调用并继续进行。

如果即使它是null你没有打电话也没问题,检查是否为空,然后只调用该方法。

答案 1 :(得分:1)

检查每种方法的输入绝对是个好主意。因此,如果您的suspendUserTestList()方法需要非null参数,则应在使用之前检查该参数是否确实为非null。

它使您的方法更加独立,并且更少依赖于其调用环境。它也易于阅读和单独测试。

你是否那么检查来电者并不是那么容易回答,这取决于很多因素。我会选择看起来更干净的东西。

答案 2 :(得分:1)

一般来说

通常,您希望在实际使用对象的方法或属性的位置检查null。

但是,如果调用方法知道被调用的方法不会检查null(例如,当您使用库时,您无法控制如何使用您提供的对象,但通过检查代码,您可能会看到没有进行空检查),那么你必须检查null或捕获NullPointerExceptions。

在任何情况下,您都必须确保在应用程序的给定层中捕获可能的NullPointerExceptions(例如,如果有UI,您可以向用户提供信息的级别)。

特殊情况

在您自己的特定情况下,您的两种方法是公开的。因为两者都可以从外部调用,所以必须确保在最低级别(suspendUserTestList)进行空检查,因为您可能会开始从代码中的其他位置调用suspendUserTestList方法。通过在suspendUserTestList中进行空检查,可以确保将来对此方法的所有其他可能调用具有相同的空检查逻辑。

答案 3 :(得分:0)

没有固定的规则,两个地方都可以有效。常识是在被调用的方法中执行它,因此您编写逻辑的而不是在您使用该方法的所有位置。可能抛出IllegalArgumentException以不为常见情况添加新类型。

答案 4 :(得分:0)

在公共方法中检查它是绝对可以的(它被称为&#34;前提条件&#34;)。至于在通话之前进行检查,这取决于您使用此userTestList字段的方式。可能它在构造函数中初始化(如userTestList = new ArrayList<>())并且从未重新分配。然后无需在任何地方进行检查(最好将其声明为final)。另一方面,它可以通过这样的setter传递:

public void setUserTestList(List<UserTest> list) {
    this.userTestList = list;
}

在这种情况下,在setter中再添加一张支票要好得多。无论如何,最好尽早进行检查。