从JList中删除Item会抛出NullPointerException

时间:2011-11-25 18:19:26

标签: java swing netbeans nullpointerexception jlist

的NetBeans。使用IDE创建的UI。 我的实施顺序:

1个全局表单变量:

private DefaultListModel model;

2构造函数:

ArrayList<String> cameras = repository.getCameraNames();

model= new DefaultListModel();
for (int i = 0; i < cameras.size(); i++) {
    model.addElement(cameras.get(i));
}
thelist.setModel(model);

3删除按钮:

private void btnRemoverActionPerformed(java.awt.event.ActionEvent evt) {                                           
    int index = thelist.getSelectedIndex();

    model.removeElementAt(index);
}

在removeElementAt行,我得到NullPointerException。如果我更改显式数字的索引,它可以工作但不与索引变量一起使用。但是选中的索引不起作用!

任何人都可以提供帮助吗?

哦,这里有一些stackttrace:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at FrmPrincipal.thelistValueChanged(FrmPrincipal.java:217)
at FrmPrincipal.access$000(FrmPrincipal.java:22)
at FrmPrincipal$1.valueChanged(FrmPrincipal.java:77)
at javax.swing.JList.fireSelectionValueChanged(JList.java:1798)
at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1812)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211)
at javax.swing.DefaultListSelectionModel.removeIndexInterval(DefaultListSelectionModel.java:677)
at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(BasicListUI.java:2601)
at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:179)
at javax.swing.DefaultListModel.removeElementAt(DefaultListModel.java:332)

更新

我修改了以下方法:

private void thelistValueChanged(javax.swing.event.ListSelectionEvent evt) {
    txtCameraName.setText(thelist.getSelectedValue().toString());
}

private void thelistValueChanged(javax.swing.event.ListSelectionEvent evt) {
    txtCameraName.setText((String)thelist.getSelectedValue());
}

但我不知道为什么! 有人可以解释为什么它不接受toString()并接受转换?

1 个答案:

答案 0 :(得分:8)

您的更改“已修复”您的问题,因为如果没有选择,getSelectedValue().toString()会抛出NPE,而如果没有选择,(String)getSelectedValue()会评估为null。但是,如果您在列表中放置的内容不是String s,那么当您尝试将所选值转换为ClassCastException时,您将获得String秒。所以,这可能已经解决了您当前的问题,但实际上并不是解决方案。

我会这样做:

private void theListValueChanged(ListSelectionEvent e) {
    final Object selectedValue = theList.getSelectedValue();
    if ( selectedValue != null ) {
        txtCameraName.setText( selectedValue.toString() );
    } else {
        // Clear the text since there's no selection
        txtCameraName.setText( null );
    }   
}