Java FutureTask异常

JME*_*JME 3 java asynchronous

我创建了以下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();
    }
}
Run Code Online (Sandbox Code Playgroud)

为了编译我必须赶在FutureTask的ResponseException,但至关重要的是,这ResponseException抛出的实现应用程序,而不是由FutureTask抓住.有没有办法解决这个问题,我可以从FutureTask中抛出这个异常?

JB *_*zet 5

将Callable传递给构造函数而不是传递Runnable,您将不再需要捕获异常:

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

(但FutureTask的泛型类型应该是Void而不是Object).

如果抛出ResponseException ,则FutureTask call()get()方法将抛出ExecutionException,并且此异常的原因将是ResponseException.

那就是说,你不应该简单地将Callable提交给ExecutorService,让它为你创造一个未来吗?还要尝试尊重Java命名约定,并从方法中删除throws子句,因为它不会抛出任何异常.命名也很糟糕:你的方法不会发送任何东西.它只创建一个FutureTask,在执行时会发送一个事件.