Удалить элемент из JList создает исключение NullPointerException - PullRequest
1 голос
/ 25 ноября 2011

NetBeans.Пользовательский интерфейс создан с использованием IDE.Моя реализация В порядке появления:

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.Если я изменяю индекс для явного числа, это работает, но не с переменной индекса.Но выбранный индекс не работает!

Кто-нибудь может помочь?

О, и вот некоторая трассировка стека:

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 Ответ

8 голосов
/ 25 ноября 2011

Ваше изменение "исправило" вашу проблему, потому что getSelectedValue().toString() сгенерирует NPE, если нет выбора, тогда как (String)getSelectedValue() оценит до null, если выбора нет. Но если вы когда-нибудь поместите в свой список вещи, которые не являются String с, то вы получите 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 );
    }   
}
...