.iterator()即使在检查为空时也会产生空指针异常

时间:2015-08-26 20:19:51

标签: java android arraylist iterator

我正在做一些线程。在postExecute中我需要执行迭代器任务。我检查iterator()是否为null,但它仍然产生这个错误:

java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
        at co.appname.app.Fragments.F_EditPhoto$FiltersAsyncTask.onPostExecute(F_EditPhoto.java:772)

这是我的代码,我正在检查我认为的每个可能的空方案。你能告诉我做错了吗?

@Override
        protected void onPostExecute(Void aVoid)
        {
            List<K_FilterPreview> filtersCache = _positionToFiltersCacheMap.get(_selectedEditImage.position);
            if (filtersCache == null || filtersCache.iterator() == null)
            {
                System.err.println("Filter cache was null");
            }

            // THIS IS THE LINE THROWING THE ERROR!
            Iterator<K_FilterPreview> i = filtersCache.iterator();
            while (i.hasNext())
            {
                //Do stuff
            }
        }

只有当我尝试在当前事件处理完成后立即启动此事件时,才会发生这种情况。如果我在调用它之前等待几秒钟它可以正常工作。因此,线程会发生一些事情,但我不确定是什么。

2 个答案:

答案 0 :(得分:3)

if (filtersCache == null || filtersCache.iterator() == null)
{
     System.err.println("Filter cache was null");
}

如果filtersCache为空,则只打印一个错误语句,然后程序继续在空iterator上调用filtersCache。在这种情况下,您可能只想从方法返回。此外,通常当您在列表中获得Iterator时,它不会返回null,因此我不认为在该条件中需要第二部分:

if (filtersCache == null)
{
     System.err.println("Filter cache was null");
     return;
}

答案 1 :(得分:1)

检查以确保filtersCache不是null,然后致电.iterator()

    protected void onPostExecute(Void aVoid)
    {
        List<K_FilterPreview> filtersCache = _positionToFiltersCacheMap.get(_selectedEditImage.position);
        if (filtersCache == null || filtersCache.iterator() == null)
        {
            System.err.println("Filter cache was null");
        }

        // THIS IS THE LINE THROWING THE ERROR!
        if(filtersCache != null && filtersCache.iterator() != null){
            Iterator<K_FilterPreview> i = filtersCache.iterator();

            while (i.hasNext())
            {
                //Do stuff
            }
        }
    }