Java SwingWorker done()方法使用get()抛出nullpointerexception

Java SwingWorker done()方法使用get()抛出nullpointerexception,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我编写了一个swing worker,负责计算一些文本统计信息,然后用结果更新EDT中的GUI元素。 经过一些实验,我发现您应该只在done()方法中操作GUI,而不是在doInBackground()中操作。为了实现这一点,我将worker重新建模为具有返回值String[],我应该能够使用get()获取该值。 除了一些publish()方法之外,您可能会发现一些来自直接操作GUI的doInBackground()方法的错误调用,如果您认为我的问题可能是由此引起的,请告诉我 package m

我编写了一个swing worker,负责计算一些文本统计信息,然后用结果更新EDT中的GUI元素。 经过一些实验,我发现您应该只在
done()
方法中操作GUI,而不是在
doInBackground()中操作。为了实现这一点,我将worker重新建模为具有返回值
String[]
,我应该能够使用
get()
获取该值。 除了一些
publish()
方法之外,您可能会发现一些来自直接操作GUI的
doInBackground()
方法的错误调用,如果您认为我的问题可能是由此引起的,请告诉我

package my.worker;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import my.tools.CountKeywords;
import my.tools.FilterStopwords;
import my.tools.KeywordSuggestion;
import my.tools.RelevanceRanking;

public class ProcessDatabaseWorker extends SwingWorker<String[], String> {

    private final JLabel debugJLabel;
    private final JLabel infoJLabel;
    private final JLabel warnJLabel;
    private final JLabel errorJLabel;
    private final JLabel infoboxJLabel;
    private final String databaseString;
    private final JProgressBar jProgressBar;
    private final JComboBox keywordJComboBox;
    private int percent;
    private int index;

public ProcessDatabaseWorker(JProgressBar jProgressBar, String databaseString,
            JLabel debugJLabel, JLabel errorJLabel, JLabel warnJLabel,
            JLabel infoJLabel, JLabel infoboxJLabel,
            JComboBox keywordJComboBox) {
        this.percent = 1;
        this.jProgressBar = jProgressBar;
        this.databaseString = databaseString;
        this.debugJLabel = debugJLabel;
        this.errorJLabel = errorJLabel;
        this.infoJLabel = infoJLabel;
        this.warnJLabel = warnJLabel;
        this.infoboxJLabel = infoboxJLabel;
        this.keywordJComboBox = keywordJComboBox;
    }

    @Override
    protected String[] doInBackground() throws Exception {
        FilterStopwords fs = new FilterStopwords();
        CountKeywords ck = new CountKeywords();
        RelevanceRanking rr = new RelevanceRanking();
        HashMap<String, Integer> nKeywords = new HashMap();
        Map<String, TreeSet<Map.Entry<String, Double>>> keywordsPerDocument = new HashMap();
        String replace = databaseString.toLowerCase();
        String splitter = ("\\n");
        String[] documentLines = replace.split(splitter);
        int N = documentLines.length;
        publish("Stopworte werden gefiltert...", "10");
        String[] completeFilteredText = fs.filterStopwords(replace);
        publish("Keywords werden gezählt...", "20");
        HashMap<String, Integer> completeKeywords = ck.countKeywords(completeFilteredText);
        index = 0;
        percent = 1;
        final double oneLinePercent = N / 100;
        final double oneKeywordPercent = completeKeywords.size() / 100;
        completeKeywords.forEach((String key, Integer value) -> {
            int n = 0;
            key = String.valueOf(key).trim();
            for (String line : documentLines) {
                String[] lineWords = line.split(" ");
                for (String word : lineWords) {
                    word = word.trim();
                    if (word.equals(key)) {
                        n++;
                        nKeywords.put(key, n);
                    }
                }
            }
            index++;
            if (index == oneKeywordPercent) {
                percent++;
                publish("Zählung...", String.valueOf(percent));
                index = 0;
            }
        });
        publish("Keywords werden geranked...", "40");
        index = 0;
        percent = 1;
        for (String documentLine : documentLines) {
            TreeSet<Map.Entry<String, Double>> rankedKeywords;
            String[] lineFilteredWords = fs.filterStopwords(documentLine);
            HashMap<String, Integer> keywords = ck.countKeywords(lineFilteredWords);
            rankedKeywords = rr.rankKeywords(keywords, lineFilteredWords, N, nKeywords);
            keywordsPerDocument.put(documentLine, rankedKeywords);
            index++;
            if (index == oneLinePercent) {
                percent++;
                publish("Ranking...", String.valueOf(percent));
                index = 0;
            }
        }
        publish("Keyword-Vorschläge werden generiert...", "70");
        KeywordSuggestion ks = new KeywordSuggestion();
        TreeSet<Map.Entry<String, Double>> keywordSuggestionsTree = ks.keywordSuggestion(keywordsPerDocument);
        String[] keywordSuggestionsArray = new String[keywordSuggestionsTree.size()];
        index = 0;
        int index2 = 0;
        double onePercent = keywordSuggestionsTree.size() / 100;
        percent = 1;
        publish("Keyword-Vorschläge werden generiert...", "75");
        for (Map.Entry<String, Double> entry : keywordSuggestionsTree) {
            double round = round(entry.getValue(), 2);
            keywordSuggestionsArray[index2] = round + " - " + entry.getKey();
            index2++;
            index++;
            if (index == onePercent) {
                percent++;
                publish("Keywords...", String.valueOf(percent));
                index = 0;
            }
        }
        keywordJComboBox.removeAllItems();
        for (String entry : keywordSuggestionsArray) {
            publish("Keyword-Vorschläge werden befüllt...", "80");
        }
有关更多信息,请参阅完整的跟踪:

Apr 14, 2016 10:40:06 AM my.worker.ProcessDatabaseWorker done
SCHWERWIEGEND: null
java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at javax.swing.SwingWorker.get(SwingWorker.java:602)
    at my.worker.ProcessDatabaseWorker.done(ProcessDatabaseWorker.java:197)
    at javax.swing.SwingWorker$5.run(SwingWorker.java:737)
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:832)
    at sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:842)
    at javax.swing.Timer.fireActionPerformed(Timer.java:313)
    at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.NullPointerException
    at my.logfileanalyzer.LogFileAnalyzerGUI.keywordJComboBoxItemStateChanged(LogFileAnalyzerGUI.java:830)
    at my.logfileanalyzer.LogFileAnalyzerGUI.access$2400(LogFileAnalyzerGUI.java:48)
    at my.logfileanalyzer.LogFileAnalyzerGUI$15.itemStateChanged(LogFileAnalyzerGUI.java:329)
    at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223)
    at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1271)
    at javax.swing.JComboBox.contentsChanged(JComboBox.java:1330)
    at javax.swing.JComboBox.intervalRemoved(JComboBox.java:1352)
    at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:179)
    at javax.swing.DefaultComboBoxModel.removeAllElements(DefaultComboBoxModel.java:174)
    at javax.swing.JComboBox.removeAllItems(JComboBox.java:771)
    at my.worker.ProcessDatabaseWorker.doInBackground(ProcessDatabaseWorker.java:165)
    at my.worker.ProcessDatabaseWorker.doInBackground(ProcessDatabaseWorker.java:43)
    at javax.swing.SwingWorker$1.call(SwingWorker.java:295)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at javax.swing.SwingWorker.run(SwingWorker.java:334)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
现在,对于我的问题:我使用的工作程序的哪一部分不是正确的,或者我的程序逻辑哪里出错了?正如您所看到的,我对使用swing Worker和线程进行编程非常陌生,所以我相信对于由经验不足导致的简单错误,有一个简单的解决方案

此外,如果需要我的程序的任何其他部分,请让我知道,以便更好地了解正在发生的事情

编辑:错误就在用户Moh-Aw描述的地方-编辑了我的代码,如下所示:

private void keywordJComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {                                                  
        if (keywordJComboBox.getItemCount() != 0){
            if (!((String) keywordJComboBox.getSelectedItem()).equals("")) {
                String selected = (String) keywordJComboBox.getSelectedItem();
                String[] blubb = selected.split(" ");
                searchJTextField.setText(blubb[2]);
            }
        }
    }   

编辑:关于可能的重复-我很确定这篇文章是正确的。老实说,我认为这是swing workers的一个错误实现,而不是像实际那样简单-因此,这篇文章也可以关闭^^ ^

问题是您的
LogFileAnalyzerGUI
类的第830行。
keywordJComboBox
itemStateChanged()
方法导致
NullPointerException

此方法由位于
关键字jcombobox.removeAllItems()

通过删除所有项目,
ItemState
将更改为取消选择


方法
itemStateChanged()
再次运行,但组合框中没有更多的项,因此导致NPE。

问题是
LogFileAnalyzerGUI
类的第830行。
keywordJComboBox
itemStateChanged()
方法导致
NullPointerException

此方法由位于
关键字jcombobox.removeAllItems()

通过删除所有项目,
ItemState
将更改为取消选择


方法
itemStateChanged()
再次运行,但组合框中没有更多的项,因此导致NPE。

是否在组合框的itemStateChanged上启动SwingWorker?如果是,请发布该部分。您可以再次删除编辑,因为它没有帮助。而是发布
LogFileAnalyzerGUI
类的方法
KeywordJComboxItemStateChanged()
。是否在组合框的itemStateChanged上启动SwingWorker?如果是,请发布该部分。您可以再次删除编辑,因为它没有帮助。而是发布
LogFileAnalyzerGUI
类的方法
KeywordJComboxItemStateChanged()
Apr 14, 2016 10:40:06 AM my.worker.ProcessDatabaseWorker done
SCHWERWIEGEND: null
java.util.concurrent.ExecutionException: java.lang.NullPointerException
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at javax.swing.SwingWorker.get(SwingWorker.java:602)
    at my.worker.ProcessDatabaseWorker.done(ProcessDatabaseWorker.java:197)
    at javax.swing.SwingWorker$5.run(SwingWorker.java:737)
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:832)
    at sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:842)
    at javax.swing.Timer.fireActionPerformed(Timer.java:313)
    at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.lang.NullPointerException
    at my.logfileanalyzer.LogFileAnalyzerGUI.keywordJComboBoxItemStateChanged(LogFileAnalyzerGUI.java:830)
    at my.logfileanalyzer.LogFileAnalyzerGUI.access$2400(LogFileAnalyzerGUI.java:48)
    at my.logfileanalyzer.LogFileAnalyzerGUI$15.itemStateChanged(LogFileAnalyzerGUI.java:329)
    at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223)
    at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1271)
    at javax.swing.JComboBox.contentsChanged(JComboBox.java:1330)
    at javax.swing.JComboBox.intervalRemoved(JComboBox.java:1352)
    at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:179)
    at javax.swing.DefaultComboBoxModel.removeAllElements(DefaultComboBoxModel.java:174)
    at javax.swing.JComboBox.removeAllItems(JComboBox.java:771)
    at my.worker.ProcessDatabaseWorker.doInBackground(ProcessDatabaseWorker.java:165)
    at my.worker.ProcessDatabaseWorker.doInBackground(ProcessDatabaseWorker.java:43)
    at javax.swing.SwingWorker$1.call(SwingWorker.java:295)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at javax.swing.SwingWorker.run(SwingWorker.java:334)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
private void keywordJComboBoxItemStateChanged(java.awt.event.ItemEvent evt) {                                                  
        if (keywordJComboBox.getItemCount() != 0){
            if (!((String) keywordJComboBox.getSelectedItem()).equals("")) {
                String selected = (String) keywordJComboBox.getSelectedItem();
                String[] blubb = selected.split(" ");
                searchJTextField.setText(blubb[2]);
            }
        }
    }