2017-10-02 4 views
0

私は数日間スレッドとタスクを学習しようとしていますが、それでも私のアプリでそれを実装することはできません...ヘルプplz。JavaFXなぜタスクがNullを返すのですか?

すべてのデータベース操作を、アプリケーションスレッド以外のバックグラウンドスレッドで実行したいとします。 私は、このクラスでは、私は仕事でのexecuteQuery文を囲まれています。データベースクエリを管理するクラスを持っている:あなたはメソッドがResultSetを返す必要があります見ることができるように

public class Database { 

ResultSet rs; 

public ResultSet execQuery(PreparedStatement stmnt) throws SQLException {  
    Task<ResultSet> task = new Task<ResultSet>() { 
    @Override protected ResultSet call() throws Exception { 
      if (isCancelled()) { 
      }      

       ResultSet execRs = stmnt.executeQuery(); 
       return execRs; 
     } 
    };  
    task.run(); 
    task.setOnSucceeded(new EventHandler<WorkerStateEvent>(){ 
     @Override 
     public void handle(WorkerStateEvent event) {     
      rs = task.getValue(); 
     }    
    }); 
    return rs; 
} 
// remaining Code 
} 

が、私は別の場所からこれを呼び出すときnullポインタを送出する...このメソッドから返される結果セットはnullです。

ここで私は何が間違っていましたか?

アップデート#1 @James_Dは、この偉大なlinkをありがとう...私は最終的な概念を理解すると思う...しかし、まだそれを実装すると小さな問題を抱えている...例えば、私の認証方法で後私は2つの問題を抱えてい

private boolean isShiftOpen(int userId, int branchId, int comId) throws SQLException, ClassNotFoundException { 
//  final boolean success = false; 
     Task<Shift> task = new Task<Shift>(){ 
      @Override 
      protected Shift call() throws Exception { 
       return ShiftDAO.getShift(userId, branchId, comId); 
      }    
     }; 
     task.setOnFailed(e -> { 
      System.out.println("isShiftOpenTask Faild!!"); 
      success = false; 
     }); 
     task.setOnSucceeded(e -> { 
      System.out.println("isShiftOpenTask Succeeded!!"); 
      Shift shift1 = task.getValue(); 
      System.out.println("User Open Shift Exists ... returning true"); 
      SessionBean.setShiftId(shift1.getShiftId()); 
      SessionBean.setUserId(shift1.getUserId()); 
      SessionBean.setUserBranch(branchId); 
      success = true; 
     }); 
     exec.execute(task); 
     return success; 

    } 

:ユーザーは、私は、そのユーザが開いシフトを持っている場合ので、私はこれに方法を変更し、あなたのリンクをたどる...チェックしたい認証され の1- exec.executeを(タスク)は、ヌルポイント例外を発生させます。 2私はこのメソッドから返されたブール変数を使用したがっています...私はそのような変数にアクセスする唯一の方法はメソッドの外で定義することです...しかし、私はこのような別のメソッドを使用したいそれに対して別のブール変数を宣言してください...これはあなたのところにぴったりですか?

あなたはすなわち、その文は、タスクが終了するまで完了しません、現在のスレッド上でタスクを実行

task.run(); 

呼んお時間 ガドガドため

+0

に相当します。問題1.関連はありません。 NPEを簡単にデバッグできます。https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-itを参照してください。バックグラウンドスレッドでこれを実行している場合は、 'isShiftOpen'メソッドはタスクが完了する前に*を返します。それは基本的にスレッドを使用する全体のポイントです。したがって、タスクの中で何が起きるかによって決まる値を返すことはできません。あなたはその価値をどうしますか?それが何であれ、それは 'onSucceeded'ハンドラと' onFailed'ハンドラに入るべきです。 –

答えて

関連する問題