Кажется, что исключение убивает обновление JList - PullRequest
0 голосов
/ 25 июня 2010

Я использую ActionListener для обновления JList при каждом выборе элемента.

jComboBox.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        JComboBox cb = (JComboBox) e.getSource();
        updateLocalFileList( cb.getSelectedItem().toString() );
    }
});

Он вызывает этот метод для пользовательского интерфейса.

public void updateLocalFileList( String path ){
    DefaultListModel model = new DefaultListModel();
    for (String str : LocalFileSystem.getFileListFromDirectory( path )) {
        model.addElement( str );
    }
    getJList().setModel(model);
}

Если getFileListFromDirectory ()выдает NullPointerException, скажем, когда буква пустого дисковода DVD выбрана, это, по-видимому, мешает ActionListener работать должным образом.

Я не уверен, что именно происходит, но я подозреваю, что передача нулевого значения вэта проблема вызывается моделью.

Есть идеи?

Редактировать

Вот запрашиваемая трассировка стека.Как видите, метод явно вызывает исключение NullPointerException на недоступных дисках.Я точно не знаю, почему это предотвращает обновление JList, так как остальная часть приложения работает нормально.

java.lang.NullPointerException
    at mine.View.updateLocalFileList(View.java:274)
    at mine.View$1.actionPerformed(View.java:262)
    at javax.swing.JComboBox.fireActionEvent(Unknown Source)
    at javax.swing.JComboBox.setSelectedItem(Unknown Source)
    at javax.swing.JComboBox.setSelectedIndex(Unknown Source)
    at javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(Unknown Source)
    at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Ответы [ 4 ]

2 голосов
/ 25 июня 2010

Я бы сделал две вещи, чтобы сделать это более надежным.

  1. Убедитесь, что getFileListFromDirectory никогда не возвращает ноль.Если элементов нет, верните Collections.emptyList, а не ноль.Если это невозможно, определенно проверьте возвращаемое значение, прежде чем использовать «для каждой» итерации.В этом случае нулевой указатель остановит обновление модели.(Таким образом, щелкнув пустой диск, вы не очистите список файлов.)
  2. присвойте cb.getSelectedItem () локальную переменную и проверьте нулевое значение, прежде чем вызывать updateLocalFileList.Если cb.getSelectedItem () имеет значение null, вы можете очистить список файлов.
1 голос
/ 25 июня 2010

Ваш слушатель (тот, который вызывает исключение) не единственный, кто слушает конкретное событие.Классы Core Swing (особенно делегаты пользовательского интерфейса) регистрируют своих собственных слушателей, чтобы они могли правильно обновлять пользовательский интерфейс.Если ваш слушатель терпит неудачу, нет никакой гарантии, что все (или любые) другие слушатели будут уведомлены об этом конкретном событии.

1 голос
/ 25 июня 2010

NullPointerException возникает в EventDispatchThread (где обычно происходит весь код обновления GUI), поэтому он прерывает сам прослушиватель событий. Следовательно, ваш графический интерфейс не обновляется должным образом (больше). Чтобы предотвратить это, вы должны явно обработать исключения или перехватить причины, которые в противном случае вызвали бы их.

0 голосов
/ 25 июня 2010

Пара баллов:

Что такое класс LocalFileSystem? Это пользовательский класс?

Если в некоторых случаях ожидается, что он вернет значение NULL, используйте для него локальную переменную и проверьте, имеет ли она значение NULL, перед вызовом любого метода для него.

Вы можете проверить, существует ли данный файл или каталог, используя метод exists в File. Существует также метод isDirectory. Я предлагаю вам рассмотреть возможность его использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...