2012-07-27 94 views
0

我想将一些数据放在自定义对象的列表中。我的主要自定义对象中的一项是包含两个字符串的照片列表。但每次我尝试添加照片项目我得到一个NullPointerException异常...NPE自定义对象中的(子)对象填充列表

我的代码:

@Override 
protected String doInBackground(Void... params) { 
    String language = Locale.getDefault().getISO3Language(); 
    AssetManager assetManager = getAssets(); 
    InputStream inputStream = null; 
    try { 
     inputStream = assetManager.open("MyJson.json"); 
    } catch (IOException e) { 
     Log.e("tag", e.getMessage()); 
    } 
    ObjectMapper objectMapper = new ObjectMapper(); 
    Log.i("tijdlog","start parsing"); 
    try { 

     List<JJsonResponse> jsonResponse = objectMapper.readValue(inputStream, new TypeReference<List<JJsonResponse>>() { }); 
     Log.i("tijdlog","ended json parsing"); 
     final List<JJsonResponse> myGlobalVariable = jsonResponse; 

     //Simple Venues maken, rest weggooien! 
     List<SimpleVenue> sv = new ArrayList<SimpleVenue>(); 
     JJsonResponse e; 
     int k =0; //indicator 1e SimpleVenue 
     JVenueThemes jtheme; 
     SimpleVenue tempSv; 
     SimplePhotos tempPhoto; 
     int selectedCounter; 

     for(int i=0;i < jsonResponse.size() ;i++) { 
      e = jsonResponse.get(i); 
      if(e.venue.hidden == false) { //staat aan 
       for(int j=0; j<e.venue.themes.size();j++) { //loop door alle themes 
        if (e.venue.themes.get(j).mobile == true) { //als theme is true 
         jtheme = e.venue.themes.get(j); 
         sv.add(new SimpleVenue()); 
         tempSv=sv.get(k); 
         tempSv.setId(k); 
         tempSv.setName(e.venue.name); 
         tempSv.setAdress(e.venue.address); 
         tempSv.setCity(e.venue.city); 
         tempSv.setPhone(e.venue.phone); 
         tempSv.setWebsite(e.venue.website); 
         tempSv.setFoursquare(e.venue.foursquare_link); 
         tempSv.setLatitude(e.venue.latitude); 
         tempSv.setLongitude(e.venue.longitude); 
         tempSv.setCategory(jtheme.icon); 
         tempSv.setIcon(jtheme.icon); 
         // language depending 
         if (language.equalsIgnoreCase("nld")){ //dutch 
          tempSv.setTip(e.venue.tip); 
          tempSv.setTheme(jtheme.name); 
         } else { //english 
          tempSv.setTip(e.venue.tip_en); 
          tempSv.setTheme(jtheme.name_en); 
         } 
         // put two (useless) photos items 
         for (int m = 0; m<2;m++) { 
          String large="pic1"; 
          String medium="pic1"; 
          tempSv.photos.add(new SimplePhotos(large,medium));          
          k++; 
         }  
        } 
       } 
      jsonResponse.remove(i); // 
      } 
     } 
    } catch (JsonParseException e) { 
     // XXX Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // XXX Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return language; 
} 

SimpleVenue:

public class SimpleVenue implements Serializable, Comparable<SimpleVenue>{ 
     /** 
     * 
     */ 
    private static final long serialVersionUID = 1L; 
    public int ID; 
    public String name; 
    public String category; 
    public String address; 
    public String city; 
    public String tip; 
    public String phone; 
    public String website; 
    public String foursquare; 
    public float latitude; 
    public float longtitude; 
    public String theme; 
    public String icon; 
    public String exception; 
    public List<SimplePhotos> photos; 

SimplePhotos;

public class SimplePhotos implements Serializable{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    public String medium; 
    public String large; 


    public SimplePhotos(String vmedium,String vlarge){ 
     medium = vmedium; 
     large = vlarge; 
    } 

    public void setMedium(String vmedium){ 
     medium = vmedium; 
    } 

    public void setLarge(String vlarge){ 
     large = vlarge; 
    } 

    public String getMedium(){ 
     return medium; 
    } 

    public String getLarge(){ 
     return large; 
    } 

我不知道为什么这不起作用。我在后台做的AsyncTast中做了所有这些,难道这与它有什么关系? 或者我只是做了一些愚蠢的错误,我找不到。我之前在objectslist中使用过objectslists,但从来没有这个问题。我的错误是在线

tempSv.photos.add(new SimplePhotos(large,medium));

+1

你可以发布堆栈跟踪吗?您也可以在测试之前在线上创建SimplePhotos,在尝试设置它之前查看它是否为空。 – 2012-07-27 12:27:45

回答

2

您还没有表现出完整的声明,但它不出现,您正在SimpleVenue类中的初始化列表photos。您需要将实现List接口的类的实例分配给此字段。例如:

public List<SimplePhotos> photos = new ArrayList<SimplePhotos>(); 
+0

但是在SimpleVenue类中我已经有:public List photos;这还不够吗? – Jasper 2012-07-27 12:45:00

+0

@japser不,这只是声明一个可以保存对列表的引用的字段。默认情况下,字段初始化为null,这就是为什么当您尝试调用add()方法时获得NPE的原因。在调用add()方法之前,您需要指定字段以引用实际对象。 – 2012-07-27 13:44:47

+0

罗素谢谢你,我按照你的建议做了,它的工作很完美。 – Jasper 2012-07-27 14:52:01

1

这似乎好像tempSv.photos为空(尚未初始化(可能想这在构造函数))

0

你永远不会初始化tempSv的照片列表。你必须添加像tempSv .photos = new ArrayList();