我对Java和Android开发很陌生。我查看了AsyncTask
的代码,看到该类抛出3个例外:
InterruptedException
ExecutionException
TimeoutException
当我在AsyncTask
对象上运行execute方法时,为什么编译器会抱怨如果我没有抓住InterruptedException
和ExecutionException
,但是没有抱怨TimeoutException
?
更一般地说,我们如何知道需要捕获哪些异常? (当然,我会查看编译器错误并编写缺少的catch块,但我想了解它背后的原理)。
非常感谢!
Example code:
public void test() {
AsyncTask at = new AsyncTask() {
@Override
protected Object doInBackground(Object[] params) {
return null;
}
};
Object o;
try {
o = at.execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
编辑:我检查过TimeoutException
是一个已检查的异常(应该被捕获)。但是@NicolasFilotto已经回答了我的问题。谢谢大家。
答案 0 :(得分:1)
get()
方法只会引发InterruptedException
,ExecutionException
和CancellationException
这就是为什么您不需要在案例中抓住TimeoutException
,只有方法get(long timeout, java.util.concurrent.TimeUnit unit)
会抛出上面列出的3个例外和CancellationException
,这是get()
的对应但是超时。
注意: CancellationException
是未经检查的例外情况,因此无需捕获。