5

我试图停止我的线程在哪里WatchService工作。但是怎么做呢?我WatchService在那里等待文件夹中的新更新:

key = watchService.take(); 

我在那里开始我的线程:

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();

    }

我试图停止:

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

当我尝试执行停止时,我得到NullPointerException了关键。当我刚刚用 关闭 watchService 时watchService.close(),我得到另一个异常ClosedWatchServiceException

如何关闭一个WatchService没有任何异常?对不起,我的英语不好..

4

1 回答 1

8

你得到的异常正在发生,因为你没有控制你的 UI 事件。

ClosedWatchServiceException当您尝试使用已调用WatchService其方法的 a 时会发生A。close()所以你可能watchService.take()WatchService调用close(). take()关闭WatchService并立即抛出Exception.

你得到一个NullPointerExceptionwithkey因为你试图cancel()在初始化之前调用实例。我猜它在你班上的某个地方被宣布为

private WatchKey key;

默认情况下,实例引用类型变量初始化为null. 如果你的执行从来没有让你通过

key = watchService.take(); 

然后key会留下来null

于 2013-09-06T19:12:39.897 回答