我正试图阻止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
,没有任何例外情况?
抱歉我的英文不好..
答案 0 :(得分:6)
您正在进行例外处理,因为您没有控制您的UI事件。
当您尝试使用已调用WatchService
方法的close()
时,会出现ClosedWatchServiceException
。因此,在调用watchService.take()
后,您可能正在调用WatchService
或其他close()
方法。关闭take()
并立即抛出WatchService
后,Exception
方法可能会取消阻止。
您获得NullPointerException
key
,因为您在初始化之前尝试在实例上调用cancel()
。我猜它在你班上的某个地方被宣布为
private WatchKey key;
默认情况下,实例引用类型变量初始化为null
。如果你的执行从未指引你完成
key = watchService.take();
然后key
将保持null
。