Ste*_*eod 22 java swing swingworker
我在Java 6中使用SwingWorker来避免在事件派发线程上运行长时间运行的代码.
如果在我的done()方法中调用get()会返回异常,那么处理异常的适当方法是什么?
我特别关注可能的InterruptedExceptions.JavaDoc示例简单地忽略了异常,但多年来我已经了解到吞咽异常导致难以调试的代码.
示例用法如下:
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
// do long-running calculation
return result;
}
@Override
protected void done() {
try {
setTextField(get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}.execute();
Run Code Online (Sandbox Code Playgroud)
Ago*_*noX 11
这是一个老帖子,但我想做一些澄清:
SwingWorker.get抛出InterruptedException,ExecutionException作为已检查的异常.
另外,它会抛出一个非常特定的未经检查的异常,即CancellationException.当然它可能会抛出任何未经检查的异常,但是CancellationException不是"特殊"和意外的异常.当你尝试调用get方法后调用取消后抛出它.
在doInBackground中抛出异常时抛出ExecutedException.原始异常包含在ExecutionException中.当调用get()方法时,将抛出ExecutionException.取出原始异常并管理它的想法很好.(正如Emil H指出的那样).
CancellationException未选中,我认为应该检查.API实现的唯一借口是不要检查它是否有状态方法isCancelled().
您可以:
-测试isCancelled(),如果是真的不要调用get(),因为它会抛出CancellationException
-环绕get()方法与try-catch代码并添加CancellationException,既然选中将不被编译器要求
-事实上,取消没有检查异常让你自由忘记所有的东西,并获得一个惊喜.
- 做任何事情,因为你不会取消工人
InterruptedException的.如果使用cancel(true)取消SwingThread,则doInBackground中的第一个可中断方法调用(确保Thread.sleep,this.wait,可能是某些IO方法)将抛出InterruptException.但是这个异常没有包含在ExecuteException中.doInBackground将以中断的异常终止.如果它被捕获并转换为其他异常,那么这些将被忽略,因为此时取消已经在EDT上调用了SwingThread.done,如果完成调用了get,它只得到标准的CancellationException.不是InterruptedException!
如果使用cancel(false)取消,则doInBackground内不会引发InterruptException.如果使用cancel(true)取消,但doInBackground中没有可中断的方法调用,则相同.在这些情况下,doInBackground将遵循其自然循环.此循环应测试isCancelled方法并正常退出.如果doInBackground不这样做,它将永远运行.我没有测试过时的存在,但我不相信.
对我来说,它仍然只是一个灰色区域.在哪些情况下,由get抛出InterruptedException?我想看一些简短的代码,因为我无法产生类似的异常.:-)
PS我在另一个问题和答案中记录了在doInBackground退出之前调用了取消时的完成和状态更改侦听器.由于这是真的,这不是一个错误 - 在设计doInBackground方法时需要特别注意.如果您对此感兴趣,请参阅SwingWorker:何时称为完成方法?