如何在java fx应用程序中捕获任务异常?

时间:2016-10-28 07:23:47

标签: java multithreading javafx executorservice

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import javafx.concurrent.Task;


public class T {

    public static void main(String[] args) {

        ExecutorService executorService = Executors.newSingleThreadExecutor();

        Task t = new Task(){

            @Override
            protected Object call() throws Exception {
                System.out.println(1/0);
                return null;
            }

        };

        //My progresss Bar in JavaFX
        //Progressbar.progressProperty().bind(t.progressProperty());

        Future future = executorService.submit(t);

        try {
            future.get();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  //returns null if the task has finished correctly.

        executorService.shutdown();


}
}

我有一个代码类似于这样的代码我的代码任务在对象调用中有内部方法调用抛出sql异常但我永远无法在Executor服务中捕获它也只是在提交调用上面我有一个javafx的进度条但是那个当使用未来时,似乎也像主要的ui一样陷入困境。没有未来进度条可行。

1 个答案:

答案 0 :(得分:4)

Future.get是一个阻止通话。这就是UI挂起的原因。

请勿使用Future来获取结果。而是使用Task的{​​{1}}事件处理程序。 onSucceeded事件处理程序可用于获取异常。例如:

onFailed
BTW:两个处理程序都在JavaFX应用程序线程上运行,因此可以安全地用于修改UI以向用户显示结果/错误。