Java 异常似乎阻止了JList的更新

Java 异常似乎阻止了JList的更新,java,swing,exception,jcombobox,Java,Swing,Exception,Jcombobox,我正在使用ActionListener在选择项目时更新JList jComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox) e.getSource(); updateLocalFileList( cb.getSelectedItem().toString() );

我正在使用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值是导致此问题的原因

有什么想法吗

编辑

这是所要求的stacktrace。如您所见,该方法显然在不可访问的驱动器上触发了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)

NullPointerException发生在EventDispatchThread上(这是所有GUI更新代码通常发生的位置),因此它会中断事件侦听器本身。因此,您的GUI无法(再)正确更新。为防止出现异常,您必须显式处理异常,或截获可能触发异常的原因。

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

我将做两件事使其更加健壮

  • 确保getFileListFromDirectory从不返回null。如果没有项,则返回集合.emptyList而不是null。如果不可能,请在使用“for each”迭代之前特别检查返回值。此时,空指针将阻止模型更新。(因此,单击空驱动器不会清除文件列表。)
  • 将cb.getSelectedItem()赋值给一个局部变量,并在调用updateLocalFileList之前检查null。如果cb.getSelectedItem()为空,则可以选择清除文件列表

  • 我会做两件事使它更健壮

  • 确保getFileListFromDirectory从不返回null。如果没有项,则返回集合.emptyList而不是null。如果不可能,请在使用“for each”迭代之前特别检查返回值。此时,空指针将阻止模型更新。(因此,单击空驱动器不会清除文件列表。)
  • 将cb.getSelectedItem()赋值给一个局部变量,并在调用updateLocalFileList之前检查null。如果cb.getSelectedItem()为空,则可以选择清除文件列表
  • 您的侦听器(引发异常的侦听器)不是唯一侦听特定事件的侦听器。核心Swing类(特别是UI委托)注册自己的侦听器,以便能够正确地更新UI。如果您的侦听器失败,则无法保证所有(或任何)其他侦听器将收到此特定事件的通知。

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

    以下几点:

    LocalFileSystem
    类到底是什么?那是自定义类吗

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

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

    < P>几点:

    LocalFileSystem
    类到底是什么?那是自定义类吗

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


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

    我知道这不是你正在发生的事情,但是,看看这个答案来学习如何阅读StAcTrace(以及它在拳头的位置)@支持应该包括链接吗?我知道这不是你正在发生的,但是,看看这个答案,了解如何读取stacktrace(以及它的第一个位置是什么)@支持应该包括一个链接吗?我有一个类扩展了
    Thread.UncaughtExceptionHandler
    ,我正在使用
    Thread.setDefaultUncaughtExceptionHandler()
    在条目中设置它。我不知道这是否足够。目前它所做的只是将异常输出到文本中,而不是:尝试可视化:getFileListFromDirectory()抛出的异常会中断事件侦听器;控制流被传输到异常处理程序,因此永远不会到达setModel()调用,因此GUI没有正确更新。感谢您的解释。你知道有哪个网站有一个很好的例子来说明如何在Swing应用程序中处理异常吗?我有一个类扩展了
    Thread.UncaughtExceptionHandler
    ,我正在使用
    Thread.setDefaultUncaughtExceptionHandler()
    在条目中设置它。我不知道这是否足够。目前它所做的只是将异常输出到文本中,而不是:尝试可视化:getFileListFromDirectory()抛出的异常会中断事件侦听器;控制流被传输到异常处理程序,因此永远不会到达setModel()调用,因此GUI没有正确更新。感谢您的解释。你知道有哪个网站有一个很好的例子来说明如何在Swing应用程序中处理异常吗