为什么在执行AsyncTask时不需要捕获TimeoutException?

时间:2017-01-10 19:50:15

标签: java android android-asynctask exception-handling timeoutexception

我对Java和Android开发很陌生。我查看了AsyncTask的代码,看到该类抛出3个例外:

  • InterruptedException
  • ExecutionException
  • TimeoutException

当我在AsyncTask对象上运行execute方法时,为什么编译器会抱怨如果我没有抓住InterruptedExceptionExecutionException,但是没有抱怨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已经回答了我的问题。谢谢大家。

1 个答案:

答案 0 :(得分:1)

get()方法只会引发InterruptedExceptionExecutionExceptionCancellationException这就是为什么您不需要在案例中抓住TimeoutException,只有方法get(long timeout, java.util.concurrent.TimeUnit unit)会抛出上面列出的3个例外和CancellationException,这是get()的对应但是超时。

注意: CancellationException是未经检查的例外情况,因此无需捕获。