异常似乎会导致更新JList

时间:2010-06-25 02:57:49

标签: java swing exception jcombobox

每当选择一个项目时,我都会使用ActionListener来更新JList。

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

它正在为UI调用此方法。

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按预期工作。

我不确定究竟发生了什么,但我怀疑将null值传递给模型会导致此问题。

有什么想法吗?

修改

这是请求的堆栈跟踪。如您所见,该方法显然会在无法使用的驱动器上触发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 个答案:

答案 0 :(得分:2)

我会做两件事来使这更加健壮。

  1. 确保getFileListFromDirectory永远不会返回null。如果没有项目,则返回Collections.emptyList而不是null。如果无法做到这一点,请在使用“for each”迭代之前专门检查返回值。就是这样,空指针将阻止模型更新。 (因此,单击空驱动器将不会清除文件列表。)
  2. 将cb.getSelectedItem()分配给局部变量,并在调用updateLocalFileList之前检查null。如果cb.getSelectedItem()为null,则可以选择清除文件列表。

答案 1 :(得分:1)

NullPointerException发生在EventDispatchThread(通常发生所有GUI更新代码的地方),因此它会中断事件侦听器本身。因此,您的GUI无法正确更新(不再)。为了防止这种情况,您必须显式处理异常,或者拦截原本会触发异常的原因。

答案 2 :(得分:1)

您的侦听器(抛出异常的侦听器)不是唯一侦听特定事件的侦听器。核心Swing类(尤其是UI委托)注册自己的侦听器,以便他们可以正确地更新UI。如果您的监听器失败,则无法保证所有(或任何)其他听众都会收到此特定事件的通知。

答案 3 :(得分:0)

有几点:

LocalFileSystem班到底是什么?这是一个自定义类吗?

如果在某些情况下预期它将返回null,则为其使用局部变量并在调用它之前检查它是否为null。

您可以使用exists上的File方法检查指定的文件或目录是否存在。还有一个isDirectory方法。我建议你考虑使用它。