我有以下代碼,剛剛得到ConcurrentModificationException。如何避免從JFileChooser.setFileFilter()調用ConcurrentModificationException?
fchProtocol = new FileChooser(lastFileLoc);
FileNameExtensionFilter xmlfilter = new FileNameExtensionFilter("xml files (*.xml)", "xml");
fchProtocol.setFileFilter(xmlfilter); <<<< ***** exception from here
的異常跟蹤信息:
java.util.ConcurrentModificationException
java.util.Vector$Itr.checkForComodification(Vector.java:1184)
java.util.Vector$Itr.next(Vector.java:1137)
javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.cancelRunnables(BasicDirectoryModel.java:340)
javax.swing.plaf.basic.BasicDirectoryModel$LoadFilesThread.cancelRunnables(BasicDirectoryModel.java:346)
javax.swing.plaf.basic.BasicDirectoryModel.validateFileCache(BasicDirectoryModel.java:135)
javax.swing.plaf.basic.BasicDirectoryModel.propertyChange(BasicDirectoryModel.java:69)
java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
java.awt.Component.firePropertyChange(Component.java:8422)
javax.swing.JFileChooser.setFileFilter(JFileChooser.java:1473)
這是Java API方法的代碼。它是最後一行拋出異常。
public void setFileFilter(FileFilter filter) {
FileFilter oldValue = fileFilter;
fileFilter = filter;
if (filter != null) {
if (isMultiSelectionEnabled() && selectedFiles != null && selectedFiles.length > 0) {
Vector<File> fList = new Vector<File>();
boolean failed = false;
for (File file : selectedFiles) {
if (filter.accept(file)) {
fList.add(file);
} else {
failed = true;
}
}
if (failed) {
setSelectedFiles((fList.size() == 0) ? null : fList.toArray(new File[fList.size()]));
}
} else if (selectedFile != null && !filter.accept(selectedFile)) {
setSelectedFile(null);
}
}
firePropertyChange(FILE_FILTER_CHANGED_PROPERTY, oldValue, fileFilter);
}
這發生在GUI初始化階段。並且xmlfileter是一個局部變量。我正在使用javaVersion = 1.8.0_20在Linux中。這是不可複製的,今年在我的開發過程中只發生過三次。
我不知道如何避免這種情況,或者如何正確使用FileChooser及其FileFilter。任何人都可以幫助我?
編輯:
它發生在應用程序初始化階段:
- 主線程與開始主() 在主線程
- 初始化幾個非GUI類;
- 致電
。
SwingUtilities.invokeAndWait(new Runnable()
public void run()
{
initalize GUI classes from here
}
);
做GUI初始化,但在初始化線程在前幾個步驟失敗。 GUI初始化線程中沒有其他線程。而且主線程沒有訪問GUI初始化線程的動作。
那時基本有兩個線程:主線程和GUI初始化線程通過invorkAndWait()調用啓動。
你可以發佈[MCVE](http://stackoverflow.com/help/mcve)嗎?我知道你說這是不可複製的,這會使它很難提供幫助。你在做什麼線程嗎? –
也許https://bugs.openjdk.java.net/browse/JDK-8068244 – copeg
我的印象是堆棧跟蹤不完整。你可以發佈一個完整的嗎? – geert3