5

I'm trying to stop my thread where WatchService is working. But how to do that? My WatchService waiting for new update in folder there:

key = watchService.take(); 

I start my Thread there:

private void startButtonActionPerformed(ActionEvent e) {

        stateLabel.setText("monitoring...");

        try {
            watchService = FileSystems.getDefault().newWatchService();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        watchThread = new WatchThread(watchService, key);
        Thread t = new Thread(watchThread);
        t.start();

    }

My trying to stop:

private void stopButtonActionPerformed(ActionEvent e) {
     try {
        if (watchService!=null) {
            key.cancel();
            watchService.close();
        }
     } catch (IOException e1) {
        e1.printStackTrace();
     }
}

When I try to execute the stop, I get NullPointerException in key. When I'm just closing watchService with watchService.close(), I get another exception: ClosedWatchServiceException.

How to close a WatchService without any exceptions? Sorry for my bad english..

4

1 に答える 1

8

UI イベントを制御していないため、例外が発生しています。

メソッドが呼び出されたをClosedWatchServiceException使用しようとすると、 が発生します。したがって、おそらく を呼び出した後、または他のメソッドを呼び出しています。を閉じた後にメソッドのブロックが解除され、すぐに がスローされる場合があります。WatchServiceclose()watchService.take()WatchServiceclose()take()WatchServiceException

インスタンスを初期化する前にインスタンスを呼び出そうとしているため、 NullPointerExceptionwith を取得します。クラスのどこかで次のように宣言されていると思いますkeycancel()

private WatchKey key;

デフォルトでは、インスタンス参照型変数は に初期化されnullます。あなたの実行があなたを通り抜けないなら

key = watchService.take(); 

key残りますnull

于 2013-09-06T19:12:39.897 に答える