Java 自定义对象中(子)对象的NPE填充列表
我试图将一些数据放入自定义对象列表中。我的主要自定义对象中的一项是照片列表,其中包含两个字符串。但每次我尝试添加照片项目时,我都会得到一个nullpointerexception 我的代码:Java 自定义对象中(子)对象的NPE填充列表,java,android,list,nullpointerexception,Java,Android,List,Nullpointerexception,我试图将一些数据放入自定义对象列表中。我的主要自定义对象中的一项是照片列表,其中包含两个字符串。但每次我尝试添加照片项目时,我都会得到一个nullpointerexception 我的代码: @Override protected String doInBackground(Void... params) { String language = Locale.getDefault().getISO3Language(); AssetManager assetManager =
@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;
}
我不知道为什么这不起作用。我是在一个异步后台做这一切的,这可能与此有关吗?
或者我只是犯了一些我找不到的愚蠢的错误。我以前在objectslist中使用过objectslist,但从未遇到过这个问题。我的错误在线上
tempSv.photos.add(新的SimplePhotos(大、中))
您尚未显示完整声明,但是您似乎并未初始化
SimpleVenue
类中的photos
列表。您需要将实现列表
接口的类的实例分配给此字段。例如:
public List<SimplePhotos> photos = new ArrayList<SimplePhotos>();
public List photos=new ArrayList();
您尚未显示完整声明,但是您似乎并未初始化simplevue
类中的photos
列表。您需要将实现列表
接口的类的实例分配给此字段。例如:
public List<SimplePhotos> photos = new ArrayList<SimplePhotos>();
public List photos=new ArrayList();
似乎tempSv.photos为空(尚未初始化(可能希望在构造函数中使用此项))似乎tempSv.photos为空(尚未初始化(可能希望在构造函数中使用此项))您从未初始化tempSv的照片列表。您必须添加tempSv.photos=newArrayList()之类的内容 您从未初始化tempSv的照片列表。您必须添加tempSv.photos=newArrayList()之类的内容 你能发布堆栈跟踪吗?您还可以在尝试设置之前在行上创建SimplePhotos,然后测试它是否为null。您可以发布堆栈跟踪吗?您也可以在尝试设置SimplePhotos之前在行上创建SimplePhotos,然后测试它是否为null;这还不够吗?@japser不,这只是声明了一个可以保存列表引用的字段。默认情况下,字段被初始化为null,这就是为什么在尝试调用NPE上的add()方法时会得到NPE。在调用add()方法之前,您需要分配字段以引用实际对象。Russel谢谢,我按照您的建议做了,它工作得很好。但是在SimpleVue类中,我已经有了:public List photos;这还不够吗?@japser不,这只是声明了一个可以保存列表引用的字段。默认情况下,字段被初始化为null,这就是为什么在尝试调用NPE上的add()方法时会得到NPE。在调用add()方法之前,您需要指定字段以引用实际对象。谢谢,我按照您的建议做了,它工作得非常好。
public List<SimplePhotos> photos = new ArrayList<SimplePhotos>();