【问题标题】:Why TimeoutException does not need to be caught when executing AsyncTask?为什么执行AsyncTask时不需要捕获TimeoutException?
【发布时间】:2017-05-25 10:27:42
【问题描述】:

我对 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 已经回答了我的问题。谢谢大家。

【问题讨论】:

  • 我检查了 TimeoutException 是一个已检查的异常。但是@NicolasFilotto 已经回答了我的问题。谢谢大家。

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


【解决方案1】:

get() 方法仅抛出 InterruptedExceptionExecutionExceptionCancellationException,这就是为什么您不需要捕获 TimeoutException,只有方法 get(long timeout, java.util.concurrent.TimeUnit unit) 会抛出上面列出的 3 个异常CancellationExceptionget() 的对应物,但有超时。

注意:CancellationException 是未经检查的异常,因此不需要被捕获。

【讨论】:

  • 感谢您指出@NicolasFilotto 它对您有帮助:)
猜你喜欢
  • 2013-10-11
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多