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

时间:2015-03-06 10:12:01

标签: java hadoop dictionary mapreduce reduce

我必须在数据集上应用算法。数据集由两种类型的对象组成,每种对象都有一个特定的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的Thos,我保留它们。这意味着如果ObjectType1中有一个ObjectType1 ID(Long为1L,则为第一个) - >保养它。 如果ObjecType1 ID不存在则是ObjectType2之一 - >我们没有保留它。 我怎样才能做到这么简单&#34;排序&#34; ?

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

    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()))处出现,因为当我尝试获取ID&#39; 3L&#39; objType2它不存在......

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

有一个很好的技巧可以避免空指针异常。这是 -

public List<SomeObject> someMethodReturnsSomeObjects(){

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

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

}   

在这里,您还需要针对null进行测试。但此代码段的好处是,您只需在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);
for Set: return (null != map ? map : Collections.EMPTY_SET);
或者对于其他用户定义的数据类型,您可以创建自己的虚拟数据,如EMPTY_MAP或EMPTY_LIST。

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