2016-10-28 18 views
2
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(); 


} 
} 

私はこのようなコードを持っています。私のコードタスクはSQLExceptionをスローするオブジェクト呼び出しの内部メソッド呼び出しを持っていますが、実行呼び出しサービスの中でも実行呼び出しサービスの中でもキャッチできません。javafxのプログレスバーしかし、それはまた、将来を使用するとき、メインUIがハングアップするように立ち往生するように見える。将来的にはプログレスバーは機能しません。java fxアプリケーションでタスク例外をキャッチする方法は?

答えて

4

Future.getはブロッキングコールです。これがUIがハングする理由です。

結果を得るためにFutureを使用しないでください。代わりに、TaskonSucceededイベントハンドラを使用してください。 onFailedイベントハンドラを使用して例外を取得できます。例:

t.setOnSucceeded(evt -> System.out.println(t.getValue())); 
t.setOnFailed(evt -> { 
    System.err.println("The task failed with the following exception:"); 
    t.getException().printStackTrace(System.err); 
}); 
executorService.submit(t); 

はBTW:両方ハンドラはJavaFXアプリケーション・スレッド上で実行され、従って安全にユーザに結果/エラーを表示するようにUIを変更するために使用することができます。

関連する問題