【问题标题】:indexOf cause java.lang.ArrayIndexOutOfBoundsExceptionindexOf 导致 java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2014-04-15 01:04:36
【问题描述】:

我有一个存储在文件中的用户列表,当我想向用户添加参数时,我

ArrayList<User> list = loadListFromfile();
System.out.println("USER LIST: "+ list);

//the user to update
User oldUser = getCurrentUser();
System.out.println("CURRENT USER: "+ oldUser);

//update user receives an user and an update param and returns the updated user
User newUser = updateUser(oldUser, "updateparam");
System.out.println("NEW USER: "+ newUser);

//replace the old user with the new one
list.set(list.indexOf(oldUser), newUser);

所有打印都返回正确的值,但是当我调用时

list.set(list.indexOf(oldUser), newUser);

应用程序因此错误而崩溃

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1

这真的很奇怪,我无法理解问题的原因,此外列表只有 2 项(不是 12 项)。

我该如何解决这个问题?

【问题讨论】:

  • 但在这种情况下,列表不为空,并且 println 会正确打印所有值...所以我真的不明白为什么会出现此错误
  • 哎呀,我的错..您的列表确实不为空..但是您的oldUser的索引无效..您确定oldUser在列表中..?也许只是空白或什么的问题..?
  • 因为oldUser不在list

标签: java android indexoutofboundsexception


【解决方案1】:

indexOf(oldUser) 如果未找到 oldUser,则返回 -1。在这种情况下,set(-1) 将抛出 ArrayIndexOutOfBoundsException。

【讨论】:

  • 但是 getCurrentUser();返回我要更新的当前用户...和 ​​System.out.println("CURRENT USER: "+ oldUser);打印正确的值。那为什么找不到用户呢?
  • getCurrentUser() 的代码是什么?它在列表中查找吗?另外, updateUser() 可以从列表中删除 oldUser 吗?您应该打印出列表中的值,以进行调试。
  • getCurrentUser 加载保存用户列表的文件(即在这段代码中loadListFromfile(); 访问的同一文件)并获取名称与保存的字符串名称匹配的用户首选项
  • updateUser() 怎么样?它会从列表中删除旧用户吗?
  • no 简单地获取oldUser 对象,更新一些字符串和值,然后返回新对象
【解决方案2】:

您应该将 oldUser 添加到列表中。错误信息显示 oldUser 在列表中不存在。 请补充

list.add(oldUser);

【讨论】:

    【解决方案3】:

    问题似乎是list.indexOf(oldUser) 返回-1,这实际上是一个超出范围的数组索引。如何获取 oldUser?我们可以在getCurrentUser() 上获取代码吗?

    另外,updateUser(oldUser, "updateparam") 有没有可能弄乱列表?无论是返回指向新用户的指针还是指向旧用户的指针(与您在第一个参数中传递的指针相同),它都应该起作用,并且无论它是否修改 oldUser 参数指向的实际对象,它都应该起作用.

    基本上,我担心您可能会遇到 oldUser.equals(e) 对于列表 which is called in the contains method of ArrayList 中包含的每个 e 的问题。但不能说没有代码。不过,您可能会通过这个想法找到它。

    【讨论】:

      【解决方案4】:

      oldUser 不是 -1,但它不在 list 中。这就是为什么它抛出ArrayIndexOutOfBoundsException
      根据代码System.out.println("CURRENT USER: "+ oldUser);,它不会打印-1。

      更新:

       list.indexOf(oldUser) // Returning -1.
      

      此处oldUser in list 的索引返回oldUser 的值所在的索引。 oldUser 的实际值不存在于您的 list 中,这就是它返回 -1 的原因。

      list.set(-1, newUser);
      

      当它试图在 -1 位置设置任何东西时,它会抛出 ArrayIndexOutOfBoundsException

      【讨论】:

      • getCurrentUser(); 返回我要更新的当前用户...并且System.out.println("CURRENT USER: "+ oldUser); 打印正确的值
      • @AndreaF 能否请您调试一次并在 list.set(list.indexOf(oldUser), newUser); 之前检查 oldUser 的值行吗?
      • 查看我的代码...System.out.println("CURRENT USER: "+ oldUser); 在列表集之前。并且打印正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      相关资源
      最近更新 更多