我正在尝试在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()
关闭监视服务时,我得到了另一个例外:ClosedWatchServiceException
。
如何毫无例外地关闭WatchService
?对不起,我的英语不好..
您遇到的异常正在发生,因为您没有控制 UI 事件。
当您尝试使用已调用其close()
方法的WatchService
时,会发生ClosedWatchServiceException
。因此,您可能在调用close()
后调用watchService.take()
或其他WatchService
方法。关闭WatchService
后,take()
方法可能会解锁并立即抛出Exception
。
您会收到带有key
NullPointerException
,因为您尝试在初始化实例之前在实例上调用cancel()
。我猜它在你的班级的某个地方被声明为
private WatchKey key;
默认情况下,实例引用类型变量初始化为 null
。如果您的执行从未带您通过
key = watchService.take();
那么key
将保持null
.