当我的项目运行(在运行或调试模式下)时,我得到一个ArrayIndexOutOfBounds错误,这是有道理的。什么不是我检查索引> = 0,尽管它说索引是-1,但if内部的代码仍以某种方式运行。
代码:
...
// Contact List
lstContacts = new JList();
lstContacts.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lstContacts.setPreferredSize(new Dimension(200, 200));
lstContacts.setMinimumSize(new Dimension(50, 50));
_contactList = _dbi.GetContactList();
_selectedIndex = -1; // An int declared earlier
lstContacts.setListData(_contactList.toArray());
lstContacts.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
System.out.println();
System.out.println("lstContacts.getSelectedIndex: " + lstContacts.getSelectedIndex());
System.out.println("!e.getValueIsAdjusting: " + (!e.getValueIsAdjusting()));
System.out.println("getselectedindex > 0: " + (lstContacts.getSelectedIndex() > 0));
System.out.println("Both: " + (!e.getValueIsAdjusting() && (lstContacts.getSelectedIndex() > 0)));
// Filter out mid-actions
if(!e.getValueIsAdjusting() && (lstContacts.getSelectedIndex() > 0))
{
if(pnlDetail.isVisible())
{
saveCurrentContact();
}
else
{
pnlDetail.setVisible(true);
}
System.out.println(" Both: " + (!e.getValueIsAdjusting() && (lstContacts.getSelectedIndex() > 0)));
_selectedIndex = lstContacts.getSelectedIndex();
System.out.println(" _selectedIndex: " + _selectedIndex);
System.out.println(" lstContacts.getSelectedIndex: " + lstContacts.getSelectedIndex());
PersonalContact sc = (PersonalContact)_contactList.get(_selectedIndex); //crashes here
showContact(sc);
}
}
});
...
我在列表中插入了三个虚拟联系人。单击一个运行正常,但单击另一个会抛出错误。在下面的错误中,我点击了第二个条目。
控制台输出:
...
lstContacts.getSelectedIndex: 2
!e.getValueIsAdjusting: true
getselectedindex > 0: true
Both: true
Entry ID [2] modified.
lstContacts.getSelectedIndex: -1
!e.getValueIsAdjusting: true
getselectedindex > 0: false
Both: false
Both: false
_selectedIndex: -1
lstContacts.getSelectedIndex: -1
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at main.ContactPanel$2.valueChanged(ContactPanel.java:203)
at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
... [continued]
看起来它运行正常,然后再次运行并崩溃。我错过了什么(可能是显而易见的事情)?感谢您的时间和任何帮助。
答案 0 :(得分:4)
很清楚:
两者:假
两者:假
_selectedIndex:-1
lstContacts.getSelectedIndex:-1
线程“AWT-EventQueue-0”中的异常java.lang.ArrayIndexOutOfBoundsException:-1
所选索引为-1与执行:
相同_contactList.get(-1);
请记住,java中的几乎所有集合都需要索引> = 0。
我认为你应该修改你的条件,以检查用户是否有(或没有)选择了列表中的项目,以便你可以处理错误。类似的东西:
if(lstContacts.getSelectedIndex() >= 0){
_selectedIndex = lstContacts.getSelectedIndex();
PersonalContact sc = (PersonalContact)_contactList.get(_selectedIndex);
showContact(sc);
}
希望它有所帮助。
快乐的编码!
EFRA
答案 1 :(得分:2)
正如您对帖子的评论所表明的那样,其他一些线程可能正在更新您的列表,并在您使用JList.getSelectedIndex()检查其值时取消选择所有内容。您没有显示所有代码,但是您可能正在使用lstContacts执行某些操作,即清除列表中的所有选择。
由于您要响应特定事件,请不要检查列表中选定的值,这些值在多线程环境中可能会从一个瞬间更改为下一个瞬间。而是使用ListSelectionEvent.getFirstIndex())
检查事件选择的值,该事件对于该事件应该是常量。
您可能会发现Oracle的Concurrency In Swing教程很有帮助。