【问题标题】:Why doesn't my Java exception print a stack trace when thrown inside a SwingWorker?为什么我的 Java 异常在 SwingWorker 中抛出时不打印堆栈跟踪?
【发布时间】:2013-02-04 20:39:17
【问题描述】:

为什么当我将 SwingWorker 包裹在这段代码周围时,它不再报告抛出异常?

import java.security.InvalidParameterException;

import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class Test {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new SwingWorker<Void, Void>() {

                    @Override
                    protected Void doInBackground() throws Exception {
                        IntegerString s = new IntegerString("EIGHT");
                        return null;
                    }

                }.execute();

            }

        });

    }

}

class IntegerString {

    public IntegerString(String s) {
        if (!isInteger(s)) {
            System.out.println("...throwing exception.");
            throw new InvalidParameterException("Thrown.");
        }
        // ...
    }

    static boolean isInteger(String str) {
        if (str == null) {
            return false;
        }
        int length = str.length();
        if (length == 0) {
            return false;
        }
        int i = 0;
        if (str.charAt(0) == '-') {
            if (length == 1) {
                return false;
            }
            i = 1;
        }
        for (; i < length; i++) {
            char c = str.charAt(i);
            if (c <= '/' || c >= ':') {
                return false;
            }
        }
        return true;
    }
}

【问题讨论】:

  • 它没有按照您的预期抛出或报告吗?
  • 没有被报告。我假设它被抛出但堆栈跟踪没有打印。
  • 我的猜测是仍然会抛出异常,但是内部处理程序对doInBackground() 的调用被包装在一个旨在忽略异常的 try-catch 语句中。

标签: java swing exception


【解决方案1】:

您必须调用get() 来检索doInBackground() 中发生的任何异常。比如可以在done()方法中做,即:

@Override
protected void done() {
    try {
        get();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

【讨论】:

  • 但是...异常记录到 JUL 还是类似的?
  • @jaime 不确定我是否了解谁在登录 JUL。由SwingWorker 的实现来处理异常。在doInBackground() 中发生的异常会传播到done() 包裹在ExecutionException 中。您可以分析嵌套异常并根据需要进行处理。请注意,InterruptedException 也有可能。
  • @jaime 我的意思是你的实现SwingWorker
  • 我的问题是,在让我处理异常之前,控制我的 SwingWorker 实现执行的库是否将异常堆栈跟踪/消息记录到任何记录器,因为我希望能够看到在控制台堆栈跟踪中触发任何非托管异常,而无需“管理”异常
  • @jaime 我认为Executor 中没有记录。恐怕我误解了你的问题。您是否在询问从您的doInBackground() 实现中抛出的异常?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
相关资源
最近更新 更多