看来我的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错误的网站。根据我的理解,我预期会发生这种情况:
如果确实发生了这种情况,应用程序就可以正常运行,因为稍后在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的情况下运行它并且几乎发生了同样的事情,正确的异常被抛出但没有被抓住)