0

我在从会话中检索和转换 ArrayList 时遇到问题。我收到以下错误:

    javax.servlet.ServletException: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

我将arrayList存储在会话中:

    List<UserApplication> userList = uaDAO.searchUser(eds);
    if (!userList.isEmpty()) {
    request.getSession().setAttribute("userList", userList);
    action_forward = EDITSUCCESS;

并将会话对象转换为 ArrayList,执行以下操作:

    EditStudentForm edt = (EditStudentForm)form;
    if ((session.getAttribute("userList")) instanceof List){
    List <UserApplication> studtList = (ArrayList<UserApplication>)session.getAttribute("userList");
    }
    try {
    uaDAO.editUser(edt,studtList);
    action_forward = EDITSUCCESS;
    }

我在 DAO 类中遇到了错误:

    public void editUser(EditStudentForm edt,List studtList) throws Exception {
    PreparedStatement pst = null;
    StringBuilder sb = new StringBuilder();
    int stCode =Integer.parseInt(studtList.get(1).toString());  GETTING ERROR HERE
    if (edt.getTitle() != null && !edt.getTitle().equals(studtList.get(2).toString())) {
    sb.append("title = '").append(edt.getTitle()).append("'");
    }
    .
    .
4

4 回答 4

1

您明确要求列表中的第 2 个 ( studtList.get(1)) 和第 3 个 ( studtList.get(2)) 项目,但从未真正确保此列表足够大。此外,您的代码显然甚至无法编译:

if ((session.getAttribute("userList")) instanceof List){
  List <UserApplication> studtList = ///...
}
try {
  uaDAO.editUser(edt,studtList);

studtList在块中不可访问,语句中的try括号也不匹配。if

于 2013-02-15T18:38:28.540 回答
1

检查你的studtList价值。从错误来看,您似乎studtList只包含一个项目,并且您尝试使用此代码获取第二个项目:

int stCode =Integer.parseInt(studtList.get(1).toString());

像这样更改您的代码:

  public void editUser(EditStudentForm edt,List studtList) throws Exception {
    PreparedStatement pst = null;
    StringBuilder sb = new StringBuilder();
    if(studtList.size() > 1)
        int stCode =Integer.parseInt(studtList.get(1).toString());  GETTING ERROR HERE
    if (studtList.size() > 2 && edt.getTitle() != null && !edt.getTitle().equals(studtList.get(2).toString())) {
    sb.append("title = '").append(edt.getTitle()).append("'");
    }
  }
于 2013-02-15T18:39:02.647 回答
1

studtList没有两个元素并且列表的大小可能是 1 或 0 个元素的情况下,您应该在尝试调用之前检查它studtList.get(1)。在ArrayList索引中从 0 开始,如果你想获得第一个元素,你应该调用studtList.get(0).

于 2013-02-15T18:41:14.600 回答
0

在这段代码中:

 EditStudentForm edt = (EditStudentForm)form;
    if ((session.getAttribute("userList")) instanceof List){
    List <UserApplication> studtList = (ArrayList<UserApplication>)session.getAttribute("userList");
    }
    try {
    uaDAO.editUser(edt,studtList);
    action_forward = EDITSUCCESS;
    }

您创建了一个从未使用过的新变量“studtList”。它的范围只是那一行周围的 { } 对。

在外部范围内必须有另一个具有相同名称的变量 studtList,以便“editUser()”调用可以工作。

附加说明

正如其他人所回答的那样,看起来您可能正在执行 .get(1) 并期待数组列表的第一个元素。也许。也许不吧。

于 2013-02-15T18:44:10.610 回答