我正在尝试停止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.close()关闭watchService时,出现了另一个异常:ClosedWatchServiceException

如何在没有任何异常的情况下关闭WatchService
对不起,我的英语不好..

最佳答案

由于无法控制UI事件,因此正在发生异常。

当您尝试使用已调用ClosedWatchServiceException方法的WatchService时,会出现 close() 。因此,您可能在调用watchService.take()之后调用WatchService或其他某种close()方法。关闭take()后立即释放WatchService可能会导致Exception方法取消阻止。

您会收到带有NullPointerExceptionkey,因为您试图在实例上调用cancel()之前将其初始化。我猜它是在您的类里面声明为

private WatchKey key;

默认情况下,实例引用类型变量被初始化为null。如果您的处决永远不会带您通过
key = watchService.take();

然后key将保留为null

10-04 13:59