无法从ArrayList获取值

时间:2015-04-24 11:47:38

标签: java arraylist nullpointerexception

我有一个带有对象的ArrayList。

Handler.java

public ArrayList<LinkedInAccountObject> getAllLinkedInUsersFromDatabase(){

    LinkedInAccountObject lao = new LinkedInAccountObject();
    counter++;
    lao.setAccountId(rs.getLong("account_id"));

    lao.setLinkedInAccountId(rs.getString("linkedin_account_id"));
    lao.setParentId(rs.getLong("parent_id"));
    lao.setFirstName(rs.getString("first_name"));

    lao.setLinkedInAccountId(rs.getString("linkedin_account_id"));
    lao.setEmail(rs.getString("email"));
    lao.setAccessToken(rs.getString("access_token"));
    lao.setExpiresOn(rs.getLong("expires_on"));

    laoarray.add(counter, lao);
}

我的PageLoader.java使用此对象设置值

ArrayList<LinkedInAccountObject> laoarray = lndb.getAllLinkedInUsersFromDatabase();

    for (LinkedInAccountObject lao : laoarray) {
    LinkedInPageObject lpo = new LinkedInPageObject();
    lpo.setCompanyID(lao.getParentId());
    lpo.setComment(lao.getComment());
    //lpo.setDescription(obj.getString("description"));
    //lpo.setTitle(obj.getString("title"));
    }

但我无法使用老挝对象获取细节,获得空指针。

当我打印老挝对象时,它给出如下结果,

  

数组对象[null,LinkedInAccountObject [accountId = xxx,   parentId = xx,expiresOn = xxx]]

3 个答案:

答案 0 :(得分:1)

我建议您使用以下代码替换第二个代码中的循环:

Iterator<LinkedInAccountObject> iterator = laoarray.iterator();
while(iterator.hasNext()){
    LinkedInAccountObject lao = iterator.next()
    LinkedInPageObject lpo = new LinkedInPageObject();
    lpo.setCompanyID(lao.getParentId());
    lpo.setComment(lao.getComment());
    //remaining of your code.
}

修改

根据此处发布的所有评论,我认为您已将counter变量初始化为0。在方法getAllLinkedInUsersFromDatabase()中,您使用rs.hasNext()循环循环。现在,如果这是正确的,那么当存储第一个数据时,您的方法会在LinkedInAccountObject中创建lao的新实例。然后继续counter增加1。因此,在这种情况下,counter现为0,现在变为1

在您上传的所有代码在最后一行执行后,它会执行laoarray.add(counter, lao);。此处计数器为1将lao对象添加到位置索引1处的laoarray,将位置索引0保留为null。然后它重复到ResultSet的结尾。这意味着,如果您的rs变量返回10行,则会将laoarray中的1添加到100System.out.println("laoarray length = "+laoarray.size());索引为空。

初始化laoarray变量后,您可以在“PageLoader.java”中通过counter++;验证是否发生这种情况。

如果这是正确的,那么您可以从方法getAllLinkedInUsersFromDatabase()中移除laoarray.add(counter, lao);,并将其设置在LinkedInAccountObject lao = new LinkedInAccountObject(); //counter++; remove it from here. lao.setAccountId(rs.getLong("account_id")); lao.setLinkedInAccountId(rs.getString("linkedin_account_id")); lao.setParentId(rs.getLong("parent_id")); lao.setFirstName(rs.getString("first_name")); lao.setLinkedInAccountId(rs.getString("linkedin_account_id")); lao.setEmail(rs.getString("email")); lao.setAccessToken(rs.getString("access_token")); lao.setExpiresOn(rs.getLong("expires_on")); laoarray.add(counter, lao); counter++;//place it here 之后,如下所示:

numberOfLines

答案 1 :(得分:0)

你的反击是从-1开始吗?在添加到arraylist之前,你会使用++。 这意味着第一个条目永远不会被填充。

您可以编辑代码以从索引0开始,或者在for循环中检查老虎机是否在归属之前是否为空。

答案 2 :(得分:0)

此代码似乎不完整,但我的猜测是你在添加项目之前修改计数器,所以如果你有一个数组并以counter = 0开头,你将第一个元素添加到位置1,位置0保持为空。

成功:

LinkedInAccountObject lao = new LinkedInAccountObject();
.... fill object values ......
laoarray.add(counter, lao);
counter++;