【问题标题】:Why is my ArrayList of object showing empty when i have added objects to it?当我向其中添加对象时,为什么我的对象 ArrayList 显示为空?
【发布时间】:2020-04-27 08:57:18
【问题描述】:

我正在做一个使用 spring 的项目。 我有一项服务,它将对象“婴儿”的列表返回给模型属性。 由于某种原因,在遍历循环并将对象添加到列表后,我得到 list.IsEmpty() 为真。我在这里做错了什么? 我的控制器代码:

  @GetMapping("/print")
              public String print(Model model) throws SQLException {
                  System.out.println(email);
                  ResultSet rs=DB.resultset(email);
                  model.addAttribute("items", DB.createList(rs));
                  return "contribution";
              }

我的数据库服务代码:

 public List<Baby> createList(ResultSet resultSet) throws SQLException {
    int count=0,i=0;
    ResultSet rs=resultSet;
    while(rs.next()){
        count++;
    }
    System.out.println(count);
    Baby baby[]=new Baby[count];
    List<Baby> list = new ArrayList<Baby>(count);
    while (resultSet.next()) {
        i=0;
        baby[i].setId(resultSet.getString("nameId"));
        baby[i].setName(resultSet.getString("name"));
        baby[i].setReligion(resultSet.getString("religion"));
        baby[i].setLocation(resultSet.getString("location"));
        list.add(baby[i]);
        i++;
        System.out.println(i);
        }
    System.out.println(list.isEmpty());
    return list;
}

婴儿班代码:

package com.example.demo;
public class Baby {
private String id;
private String name;
private  String religion;
private String location;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getLocation() {
    return location;
}

public String getReligion() {
    return religion;
}

public void setLocation(String location) {
    this.location = location;
}

public void setReligion(String religion) {
    this.religion = religion;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

【问题讨论】:

  • 显示resultset()的源代码。
  • 没有NullPointerException,您的代码如何运行?你什么时候真正在你的数据结构中添加了新的婴儿(babylist)?
  • 创建 arrayList 时count 的值是多少?
  • @deHaar 数据库中有一个表,其中包含所有婴儿的名字......这不是问题

标签: java mysql spring spring-boot


【解决方案1】:

您的问题是您尝试循环遍历 ResultSet 2 次:

 while(rs.next()) {
     count++;
 }

请注意,执行 ResultSet rs=resultSet; 不会创建 ResultSet 的副本。相反,您现在只有 2 个变量指向同一个 ResultSet。

一旦这个循环完成,你的 resultSet 将不再有元素,并且 next() 将返回 false。所以你的第二个循环

while (resultSet.next()) {
    ....
}

根本不会输入您尝试添加到列表中的位置。

【讨论】:

  • 但是我创建了一个临时的Resultset rs,我用它来获取表的行数,如果Resultset 是一个参考,你建议我应该怎么做?
【解决方案2】:

您必须创建 Baby 实例作为对象。然后你必须把它放在数组中。数组已经初始化了大小,但是你必须从类中添加实例,因为否则它没有引用。实际上你不需要数组。只需将Baby 实例放入列表中即可。在 DBSERVICE 中像这样更改您的 while 循环:

while (resultSet.next()) {
    Baby oneBaby = new Baby();
    oneBaby.setId(resultSet.getString("nameId"));
    oneBaby.setName(resultSet.getString("name"));
    oneBaby.setReligion(resultSet.getString("religion"));
    oneBaby.setLocation(resultSet.getString("location"));
    list.add(oneBaby);
    }

【讨论】:

    【解决方案3】:
    public List<Baby> createList(ResultSet resultSet) throws SQLException {
    
      List<Baby> list = new ArrayList<Baby>();
    
      while (resultSet.next()) {
        Baby baby= new Baby();
        baby.setId(resultSet.getString("nameId"));
        baby.setName(resultSet.getString("name"));
        baby.setReligion(resultSet.getString("religion"));
        baby.setLocation(resultSet.getString("location"));
        list.add(baby);
      }
    
      return list;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2022-01-07
      • 2011-07-12
      相关资源
      最近更新 更多