Java JList中带有ActionListener的ArrayIndexOutOfBoundsException

Java JList中带有ActionListener的ArrayIndexOutOfBoundsException,java,swing,actionlistener,indexoutofboundsexception,jlist,Java,Swing,Actionlistener,Indexoutofboundsexception,Jlist,我看了其他看起来与我有关的问题,但它们并没有“解决”我的问题。我收到ArrayIndexOutOfBoundsException,我正在处理的代码是删除JList中名为contactList的“联系人” 我已经实现了一个按钮,可以简单地删除联系人列表中的“联系人”。程序应该做的是,如果按钮删除“广播”,这是联系人列表中的第一个元素,将通过输出显示消息返回错误。否则,只需将联系人从联系人列表中删除即可 我现在遇到的问题是,在删除联系人时,它会产生arrayIndexOutOfBoundsExcep

我看了其他看起来与我有关的问题,但它们并没有“解决”我的问题。我收到ArrayIndexOutOfBoundsException,我正在处理的代码是删除JList中名为contactList的“联系人”

我已经实现了一个按钮,可以简单地删除联系人列表中的“联系人”。程序应该做的是,如果按钮删除“广播”,这是联系人列表中的第一个元素,将通过输出显示消息返回错误。否则,只需将联系人从联系人列表中删除即可

我现在遇到的问题是,在删除联系人时,它会产生arrayIndexOutOfBoundsException。不仅如此,它还从另一个if语句打印出错误行。删除广播将输出错误消息,但仍显示arraryIndexOutOfBoundsException

另外,我不确定我是否正确地执行了第一个if语句。 我在开始时已经包括了必要的代码,以及测试代码后出现的错误

private JList<String> listContacts;
listContacts = new JList<String>(controller.getContacts());
// gets contact list from controller class which gets contact list from client class.
private JButton btDeleteUser;

JButton deleteUser = new JButton("Delete User");

deleteUser.addActionListener(new MyButtonListener5());

class MyButtonListener5 implements ActionListener{
    public void actionPerformed(ActionEvent e){
        DefaultListModel<String> list = (DefaultListModel)(listContacts.getModel());
        String contact = listContacts.getSelectedValue();
        int j = -1;
        for(int i = list.getSize()-1; i >= 0; i--){
            if(list.getElementAt(i).equals("Broadcast")){
                controller.displayMsg("[ERROR] You cannot delete broadcast\n");
            }
            else if(list.getElementAt(i).equals(contact) && i != j){
                j = i;
            }
        }
        if(j != -1){
            (DefaultListModel)list.remove(j);
        }
    }
}
基本知识:

如果JList中有5个元素,那么最后一个元素的索引将是4,列表的大小将是5

问题:

 for(int i = 0; i <= list.getSize(); i++){
用于(int i=0;i基本:

如果JList中有5个元素,那么最后一个元素的索引将是4,列表的大小将是5

问题:

 for(int i = 0; i <= list.getSize(); i++){

用于(int i=0;i)您可以在迭代时更改列表。记住您要删除的项目,并在迭代之外将其删除。您是说我应该让它创建一个新的JList并将新联系人放入其中?否,但当您删除该项目并继续迭代时,列表中项目的索引与以前不同。您可以可以避免这种情况,例如,只需计算迭代期间要删除的元素并在之后删除它。所以您是说,在找到它所在的索引之后,我应该删除该项?准确地,计算循环中的索引,并在循环中移除在循环外的元素,同时遍历列表。记住您想要的项o在迭代之外删除并删除它。你是说我应该让它创建一个新的JList并将新联系人放在其中吗?不,但是当你删除该项然后继续迭代时,列表中的项的索引与以前不同。例如,你可以通过计算迭代期间要删除的元素来避免这种情况打开,然后删除它。你是说我应该在找到它所在的索引后删除该项?确切地说,计算循环中的索引并删除循环外的元素。我修改了它,但我仍然得到与删除联系人有关的错误。@whu解决该问题的方法是向后迭代数组。使用
for(int i=list.getSize()-1;i>=0;i--){
作为for循环我再次修改了它,但仍然得到相同的错误。我修改了它,仍然得到与删除联系人有关的错误。@whu解决该问题的方法是向后迭代数组。使用
for(int i=list.getSize())-1;i>=0;i--){
作为for循环,我再次修改了它,但仍然得到相同的错误。