Android / Java - 未捕获异常

时间:2014-11-06 03:53:04

标签: java android exception

看来我的try / catch块神秘地没有捕获异常。以下是相关的片段。

这是Searcher类中的try / catch块。它尝试创建一个网页对象,然后添加到一个hashmap。如果在该过程中引发异常,则取消该操作。

try {
    Webpage directSite = new Webpage(directURL);
    Log.i("tester", "Made object directSite");
    addSite(directSite);
    Log.i("tester", "Added to Hashmap");

} catch (IllegalArgumentException e) {
    Log.i("tester", "URL.com had illegal argument exception");
    e.printStackTrace();

} catch (WikipediaException e) {
     Log.i("tester", "URL.com had Wikipedia exception");
     e.printStackTrace();

} catch (ResourceNotFoundException e) {
     Log.i("tester", "URL.com had resource not found exception"); // If 404 error or similar thing happened.
     e.printStackTrace();

} catch (NetworkException e) {
    Log.i("tester", "URL.com had illegal argument exception");
    e.printStackTrace();
    activity.connectionFailure();
}

以下是网页构造函数的相关代码段,它接收一个URL并从该网站检索一些数据。

result = wizard.execute(CDX_query);
Log.i("tester","wizard response is: \'" + result + "\'");


if(result.equals("HTTP FAILED")){ // If connection error occurs, raise exception.
    Log.i("tester", "Webpage threw network exception");
    throw new NetworkException("ERROR: Network failure");

} else if(result.equals("SEARCH FAILED") ||result.equals("")){ // If resource could not be found, raise exception.
    Log.i("tester", "Webpage threw ResourceNotFoundException");
    throw new ResourceNotFoundException("ERROR: Could not find that resource");

} else{
    // Do the regular things
}

我尝试使用故意导致404错误的网站。根据我的理解,我预期会发生这种情况:

  1. Searcher尝试阻止。试图建立新的网页。
  2. 网页从向导获取结果(向导类执行HTTP操作,它工作正常)
  3. 结果显示" SEARCH FAILED"因此网页会输入相关的“其他内容”。块。
  4. 网页日志"网页引发了ResourceNotFoundException"。
  5. 网页抛出ResourceNotFoundException,停止执行。构建暂停,没有网页对象。
  6. Searcher捕获相关catch()块中的ResourceNotFoundException。
  7. 搜索者记录" URL.com有资源未找到异常"。
  8. 最重要的是,没有网页对象,并且没有执行try()块的其余部分,因此没有任何内容添加到Hashmap。
  9. 如果确实发生了这种情况,应用程序就可以正常运行,因为稍后在Searcher中会发生几乎完全相同的try / catch块,并且可以完美地处理404.这就是我如何知道网页和向导的工作原理适当的(我做过的其他测试)。

    然而,实际结果是应用崩溃并且日志看起来像这样(' tester'标签已过滤):

    wizard response is: 'SEARCH FAILED' // Makes sense.
    Webpage threw ResourceNotFoundException // Makes sense. Means the ResourceNotFoundException was indeed thrown.
    Made object directSite // Against expectation! Shouldn't do this!
    Added to Hashmap // Against expectation! Shouldn't do this!
    

    注意缺少消息" URL.com有资源未找到异常"所以Searcher不知何故没有捕获异常,并继续执行try()块。

    我已经调查并查明了坠机的原因,然后又回到了这一点。稍后,一些代码遍历hashmap并读取其对象的数据。但是,此特定网页对象具有空字段(因为没有数据从不存在的网站读入),因此它会导致NullPointerException。根据我的理解,如果从未制作过该网页对象并将其添加到哈希映射中,则可以避免这种情况。这就是为什么我有异常抛出和try / catch块的原因,如果网页在进程中抛出异常,则停止对象构造并添加哈希映射。在这种情况下,网页确实抛出了它,但是块构建并将(错误的)对象添加到hashmap中。
    那么为什么块没有抓住呢?

    (P.S.它也无法捕获NetworkException,因为我在关闭Wi-Fi的情况下运行它并且几乎发生了同样的事情,正确的异常被抛出但没有被抓住)

0 个答案:

没有答案