gpt4 book ai didi

java - 我应该特别注意NullPointerException吗?

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:02 26 4
gpt4 key购买 nike

当我使用JUnit测试来检查我的编码过程时,我发现有一些问题困扰着我。例如:

List<User> list = userDao.findBy("id",id);
list.get(0).getName();

有问题。我在使用它之前没有使用任何断言来检查列表是否为空,这可能会导致 NullPointException。但是看看业务逻辑。

当我像这样创建一个新用户时。

if(user!=null){
userDao.save(user)
}

它应该不为空。因为我在添加用户时检查用户不为空,所以我肯定知道该用户在数据库中成功。

如果我在获取用户的时候添加很多这个:

if(list!=null||list.size()>0){...};

在类似的地方使代码变得困惑。

该加还是不加?如何选择?无论如何,谢谢。

最佳答案

我认为您正在寻找的是方法 preconditions或者,更一般地说,contracts .

假设您的代码被分成许多小方法,正如它应该的那样。然后为每个方法定义前置条件和后置条件。这些都需要满足,否则就会失败。如果您始终如一地这样做,那么在哪里放置这些检查的问题几乎就会以非常直观的方式得到答案。

作为示例,让我们考虑两种编写使用 User 执行某些操作的方法的方法:

private void doSomethingWithUser(User u) {
if (u == null) {
/* take appropriate steps */
}
/* perform some action on the user object */
}

上面,该方法负责空检查。因此,调用代码不需要执行此操作。

/* 
* Does this and that with the User.
* Precondition: the User `u` may not be null!
*/
private void doSomethingWithUser(User u) {
/* perform some action on the user object */
}

这里,该方法不会检查 u 是否为 null,但阅读注释,我们可以看到该方法就是这样设计的。调用代码有责任传递一个非空对象,否则行为将是未定义的。

当然,现在您面临着何时选择其中哪一个的决定。显然,您可以为您的方法设置前提条件让它们仍然执行适当的检查。然后,他们可以返回一个指示错误的值或抛出异常,这很常见。

编辑:

but if there are lots of objects need to check before I use them?should I check them all?

考虑一下:

public class SimpleClass {
public static void main (String[] args) {
User sware = new User("sware");
User domdom = new User("domdom");

doSomethingWithUser(sware);
doSomethingWithUser(domdom);
}
}

在这里,我们在 main 方法中声明初始化两个对象。我们知道它们不为空。然后我们立即使用它们。无论该方法是否检查 null,我都不会在外部执行此类检查 - 这些对象不可能是 null

现在,假设我们有一个更复杂的代码:

public class VeryComplexClass extends ComplexClass implements ComplexInterface {
/* ... */
@Override
private boolean doSomethingWithUser(User u) {
if (u == null) {
return false;
}
/* ... */
}
}

假设我们需要实现 doSomethingWithUser() 方法来满足该接口(interface)。或者该方法来自父类,我们重写它。我们不知道 u 来自哪里。谁可能调用此方法?来自类(class)之外的用户?或者这个方法是否被类本身使用?是否会在传入成员的情况下调用它?目前还很难说。因此,我建议进行 null 检查。

关于java - 我应该特别注意NullPointerException吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43268681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com