ImageAdapter从HashMap put方法返回NullPointerException

时间:2015-02-04 01:44:06

标签: java android

尝试将String值添加到Adapter类中的HashMap时,我收到NullPointerException:

HashMap<String,String> map = new HashMap<String, String>();
....
public class ImageAdapter extends BaseAdapter {
    ....
    //---Returns the number of images---
    public int getCount() {
        return getCursor.getCount();
    }
    ....
    //---Returns the ImageView view---
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null)   
           imageView = new ImageView(context);
        else 
           imageView = (ImageView) convertView;
        getCursor.moveToPosition(position);
        int imageID       = getCursor.getInt(columnIndex);    //--- Returns unique ID --
        String fileName   = getCursor.getString(arrayIndex);  //--- Returns  filepath --
        String imageValue = String.valueOf(imageID);
        try {
            map.put(imageValue, fileName);
        } catch (NullPointerException e) {
            Log.d("DEBUG", "Line154: " + e.toString());
            e.printStackTrace();
        } 
        Log.d("DEBUG", imageValue + " " + fileName);

我不明白这一点,因为上面的最后一行显示了正确的字符串值,为什么会出错呢?请指教。

6 个答案:

答案 0 :(得分:0)

变量'map'是否已初始化?我无法看到它被设置或定义的位置,并且NullReference会导致我怀疑您要添加的地图为空。

答案 1 :(得分:0)

在哪里

 HashMap<String,String> map = new HashMap<String, String>();

这是(下面)您向我们展示的嵌套课程吗?

public class ImageAdapter extends BaseAdapter  {

如果是嵌套类,请向我们展示父类。如果没有放置

 HashMap<String,String> map = new HashMap<String, String>();
在ImageAdapter类中

答案 2 :(得分:0)

您已初始化了&#39; HashMap&#39;课外。尝试在课堂内进行初始化&#39; ImageAdapter&#39;。

答案 3 :(得分:0)

Log.d("DEBUG", imageValue + " " + fileName); 最后一行显示正确的值,因为imageValue和fileName都是ImageAdapter类的成员变量。

然而,HashMap<String,String> map = new HashMap<String, String>(); 没有在类中定义,因此错误。

答案 4 :(得分:0)

我建议你展示完整的代码和logcat。无论如何,您的代码中存在问题:

ImageView imageView; if (convertView == null)
imageView = new ImageView(context); else imageView = (ImageView) convertView;

它永远不会在else块中运行。

答案 5 :(得分:0)

我现在可以自己回答 - 经过大量的额外研究。我们需要的是一个HashMap 全局范围(这就是我最初在课外宣布它的原因)。这样做的方法 是通过在更改后扩展Application类,如下面的代码中所示 XML清单允许这样做(参见Google开发):

try {
    CustomHashMap thisMap = (CustomHashMap)getApplicationContext();
    thisMap.addKeyValue(imageValue,fileName);

    Log.d("DEBUG", "Line140 " + String.valueOf(thisMap.getSize()));
} catch (NullPointerException e) {
    Log.d("DEBUG", "Line154: " + e.toString());
    e.printStackTrace();
}
....
public static class CustomHashMap extends Application {
    HashMap<String, String> myMap;

    public CustomHashMap() {
        super();
        this.myMap = new HashMap<String, String>();
    }

    public HashMap getMap() {
        return myMap;
    }

    public int getSize() {
        return myMap.size();
    }

    public void addKeyValue(String x, String y) {
        myMap.put(x,y);
    }
}

LogCat行现在正确地指示每次迭代时单个HashMap的大小增加。