我创建了以下 FutureTask 方法来异步运行方法。

public FutureTask<Object> SendAggregateEventAsync(final
        com.Company.Product.SDK.Device.AggregateEvent.ClassObject
        request)
{
    FutureTask<Object> futureTask;

    futureTask = new FutureTask<Object>(new Runnable() {
        public void run()
        {
            try {
                SendAggregateEvent(request);
            } catch (ResponseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }, null);

    return futureTask;
}

public void SendAggregateEvent(
        com.Company.Product.SDK.Device.AggregateEvent.ClassObject
        request) throws ResponseException
{
    try
    {
        if(request == null) throw new IllegalArgumentException("request");

        String[] s_array = new String[0];
        s_array[0] = "EventTime";

        String namespace = "http://Product.Company.com/" +
                "v1.0/Device/AggregateEvent";

        IBindingFactory factory;

        factory = BindingDirectory.getFactory(
                com.Compant.Product.SDK.Device.AggregateEvent.
                ClassObject.class);

        String message = ChangeDatesToUTC(MessageHelper.
                SerializeObject(factory, request), s_array, namespace);

        SendMessage(message);

    } catch (JiBXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

为了编译,我必须在 FutureTask 中捕获 ResponseException,但必须将此 ResponseException 抛出到实现应用程序而不是由 FutureTask 捕获。有没有办法解决这个问题,我可以从 FutureTask 中抛出这个异常?

最佳答案

Pass a Callable 到构造函数而不是传递一个 Runnable,你就不必再捕捉异常了:

futureTask = new FutureTask<Object>(new Callable() {
    public Object call() throws ResponseException {
        SendAggregateEvent(request);
        return null;
    }
};

(但 FutureTask 的通用类型应该是 Void 而不是 Object )。

如果 call() 抛出 ResponseException ,则 FutureTask 的 get() 方法将抛出 ExecutionException ,该异常的原因将是 ResponseException 。

也就是说,您不应该简单地将 Callable 提交给 ExecutorService,然后让它为您创建一个 Future 吗?还要尝试遵守 Java 命名约定,并从您的方法中删除 throws 子句,因为它不会引发任何异常。命名也很糟糕:您的方法不发送任何内容。它只创建一个 FutureTask,它在执行时会发送一个事件。

关于Java FutureTask 异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16905277/

10-11 20:34