测试数据时如何避免空指针异常

Posted

技术标签:

【中文标题】测试数据时如何避免空指针异常【英文标题】:How to avoid null pointer exception while testing data 【发布时间】:2015-05-07 22:14:49 【问题描述】:

我必须对数据集应用算法。数据集由两种类型的对象组成,每种对象都有一个特定的 ID。

在这里你可以找到我的第一种对象:

public static List<ObjectType1> getObjectType1() 
List<ObjectType1> myList = new ArrayList<ObjectType1>();

//Creating one ObjectType1 with ID : 1L
ObjectType1 obj1 = new ObjectType1();
obj1.setId(1L);

//Creating one ObjectType1 with ID : 2L
ObjectType1 obj2 = new ObjectType1();
obj2.setId(2L);

//Creating one ObjectType1 with ID : 3L
ObjectType1 obj3 = new ObjectType1();
obj3.setId(3L);

myList.add(obj1);
myList.add(obj2);
myList.add(obj3);

return myList;

这是第二种对象:

public static List<ObjectType2> getObjectType2()
List<ObjectType2> myList = new ArrayList<ObjectType2>();

//Creating one ObjectType2 with ID : 1L
ObjectType2 obj1 = new ObjectType2();
obj1.setId(1L)

//Creating one ObjectType2 with ID : 2L
ObjectType2 obj2 = new ObjectType2();
obj2.setId(2L)

//Creating one ObjectType2 with ID : 4L
ObjectType2 obj3 = new ObjectType2();
obj3.setId(4L)

myList.add(obj1);
myList.add(obj2);
myList.add(obj3);

return myList;

我需要做的是对其应用一个简单的算法,但我的主要问题是我一尝试就出现空指针异常。

让我解释一下: 我想对所有的 ObjectType1 进行排序。与 ObjectType2 具有相同 ID 的那些,我保留它们。这意味着如果 ObjectType1 ID(第一个是 Long : 1L)存在于其中一个 ObjectType2 --> Ikeep 它。 如果 ObjecType1 ID 不存在是 ObjectType2 之一 --> 我们不保留它。 如何进行这种简单的“排序”?

到目前为止,我想做的是:

    while (valueIterator.hasNext()) 
        value = valueIterator.next();

        if (value instanceof ObjectType1) 
            objType1 = ObjectType1.newBuilder((ObjectType1) value).build();
         else if (value instanceof ObjectType2)
            objType2 = ObjectType2.newBuilder((ObjectType2) value).build();
        
    

    for(ObjectType1 obj : objs)
        if (objType1.getId().equals(objType2.getId())) 
            keep(objType1);
         else if (objType1.getId() != objType2.getId()) 
            dontKeep(objType1);
        
    

我的空指针异常出现在这里if (objType1.getId().equals(objType2.getId())),因为当我尝试获取 objType2 的 ID '3L' 时,它不存在...

如何在没有数据集的情况下正确进行排序?我找不到正确循环的方法。

感谢您的帮助。

【问题讨论】:

只要确保不要在尚未实例化的实例上调用方法。如果您怀疑: if ( myInstance != null ) myInstance.getId(); objs 的值是多少,并且您使用的循环变量没有任何用途obj 我通常应该保留 obj1 和 obj2,因为 ID 1L 2L 都存在于 ObjType2 中。并且 obj3 没有保留,因为没有 ID 3L 是 objType2。 【参考方案1】:

有一个很好的技巧可以避免空指针异常。在这里——

public List<SomeObject> someMethodReturnsSomeObjects()

 List<SomeObject> lists = new ArrayList<SomeObject>();

 return (null!=lists ? lists : Collections.EMPTY_LIST);

   

在这里您还需要针对null 进行测试。但是这段代码 sn-p 的好处是您只需要在一个地方检查null,例如在您的ObjectType1.newBuilder((ObjectType1) value).build() 方法中,同时返回objectType1。但在那之后,您永远不需要检查 null,因为您确定您的方法永远不会返回 null。现在你再也不需要用null检查ObjectType1.newBuilder((ObjectType1) value).build()的客户端代码了。

此外,您可以处理大多数数据类型,例如 -for String: return (null != str ? str : "");for Map : return (null != map ? map : Collections.EMPTY_MAP);设置: return (null != map ? map : Collections.EMPTY_SET); 或者对于其他用户定义的数据类型,您可以创建自己的虚拟数据,例如 EMPTY_MAP 或 EMPTY_LIST。

希望它会有所帮助。 非常感谢。

【讨论】:

感谢 Razib,但我不明白。我不需要更改数据集。重要的是根据我的算法收集ObjectType1。 所以你返回一个 ObjectType1 的对象。在这种情况下,如果 objectType1 为 null,您可以创建一个虚拟 objectType1。

以上是关于测试数据时如何避免空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

jsp 505空指针异常

SpringBoot配置拦截器空指针异常

java中的空指针异常怎么解决

除了try{}catch{},你究竟还知道多少避免空指针异常的骚操作?

除了try{}catch{},你究竟还知道多少避免空指针异常的骚操作?

除了try{}catch{},你究竟还知道多少避免空指针异常的骚操作?