0

項目が選択されるたびに 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

4 に答える 4

2

これをより堅牢にするために、2つのことを行います。

  1. getFileListFromDirectoryがnullを返さないようにしてください。アイテムがない場合Collections.emptyListは、nullではなく戻ります。それが不可能な場合は、「foreach」の反復を使用する前に、特に戻り値を確認してください。現状では、nullポインターはモデルの更新を停止します。(したがって、空のドライブをクリックしてもファイルリストはクリアされません。)
  2. cb.getSelectedItem()をローカル変数に割り当て、updateLocalFileListを呼び出す前にnullをチェックします。cb.getSelectedItem()がnullの場合、ファイルリストをクリアすることを選択できます。
于 2010-06-25T03:14:15.477 に答える
1

特定のイベントをリッスンするのは、リスナー(例外をスローするリスナー)だけではありません。Core Swingクラス(特にUIデリゲート)は、UIを適切に更新できるように、独自のリスナーを登録します。リスナーに障害が発生した場合、他のすべてのリスナー(またはいずれか)にこの特定のイベントが通知される保証はありません。

于 2010-06-25T07:13:45.697 に答える
1

NullPointerExceptionはEventDispatchThread(すべてのGUI更新コードが通常発生する場所)で発生するため、イベントリスナー自体に割り込みます。したがって、GUIは適切に更新されません(もう)。これを防ぐには、例外を明示的に処理するか、例外をトリガーする原因をインターセプトする必要があります。

于 2010-06-25T03:12:12.357 に答える
0

いくつかのポイント:

クラスって具体的にどんなLocalFileSystemクラス?カスタムクラスですか?

場合によっては null を返すことが予想される場合は、ローカル変数を使用して、メソッドを呼び出す前に null かどうかを確認してください。

existsのメソッドを使用して、特定のファイルまたはディレクトリが存在するかどうかを確認できますFile。というisDirectory方法もあります。使用を検討することをお勧めします。

于 2010-06-25T17:25:51.693 に答える