为什么执行AsyncTask时不需要捕获TimeoutException?
Why TimeoutException does not need to be caught when executing AsyncTask?
我对 Java 和 Android 开发还很陌生。我查看了 AsyncTask
的代码,看到 class 抛出了 3 个异常:
InterruptedException
ExecutionException
TimeoutException
当我 运行 在 AsyncTask
对象上执行方法时,如果我没有捕获 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 已经回答了我的问题。谢谢大家
get()
method only throws InterruptedException
, ExecutionException
and CancellationException
that is why you don't need to catch TimeoutException
in your case, only the method get(long timeout, java.util.concurrent.TimeUnit unit)
抛出上面列出的 3 个异常,CancellationException
与 get()
对应,但有超时。
注意: CancellationException
是一个未经检查的异常,所以不需要捕获。
我对 Java 和 Android 开发还很陌生。我查看了 AsyncTask
的代码,看到 class 抛出了 3 个异常:
InterruptedException
ExecutionException
TimeoutException
当我 运行 在 AsyncTask
对象上执行方法时,如果我没有捕获 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 已经回答了我的问题。谢谢大家
get()
method only throws InterruptedException
, ExecutionException
and CancellationException
that is why you don't need to catch TimeoutException
in your case, only the method get(long timeout, java.util.concurrent.TimeUnit unit)
抛出上面列出的 3 个异常,CancellationException
与 get()
对应,但有超时。
注意: CancellationException
是一个未经检查的异常,所以不需要捕获。