获取参数异常(nil URL参数)!

时间:2012-06-09 02:56:58

标签: objective-c xml-parsing uncaught-exception initwithcontentsofurl

我遇到这个问题,我的iPhone上出现此错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSConcreteData initWithContentsOfURL:options:error:]: nil URL argument'

我正在尝试解析一些XML数据,当我在模拟器上尝试这个时,我没有得到任何错误,但每当我在iOS设备上尝试它时,我都会在控制台中收到错误!

这是我解析XML的代码:

- (ICB_WeatherConditions *)initWithQuery:(NSString *)query {

if (self = [super init])
{
    CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", query]] options:0 error:nil] autorelease];

    condition         = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/condition" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];        
    location          = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_information/city" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
    day2c    = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/condition" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] retain];
    day3c     = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/condition" error:nil] objectAtIndex:1] attributeForName:@"data"] stringValue] retain];

    currentTemp       = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/temp_f" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];
    lowTemp           = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions[2]/low" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];
    highTemp          = [[[[[parser nodesForXPath:@"/xml_api_reply/weather/forecast_conditions/high" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue] integerValue];

    conditionImageURL = [[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com%@", [[[[parser nodesForXPath:@"/xml_api_reply/weather/current_conditions/icon" error:nil] objectAtIndex:0] attributeForName:@"data"] stringValue]]] retain];
}

return self;}

这是我发送查询的代码:

- (void)showWeatherFor:(NSString *)query {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

ICB_WeatherConditions *weather = [[ICB_WeatherConditions alloc] initWithQuery:query];

self.conditionsImage = [[UIImage imageWithData:[NSData dataWithContentsOfURL:weather.conditionImageURL]] retain];

[self performSelectorOnMainThread:@selector(updateUI:) withObject:weather waitUntilDone:NO];


[pool release];}

请指点我正确的方向!再次感谢!

2 个答案:

答案 0 :(得分:2)

为了帮助您入门:错误会显示在if语句的第一行。这会构建一个字符串和一个URL,例外是“nil URL argument”。所以将这一行分成几部分:

NSString *queryPath = [NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", query];
NSURL *queryURL = [NSURL URLWithString:queryPath];
CXMLDocument *parser = [[[CXMLDocument alloc] initWithContentsOfURL:queryURL options:0 error:nil] autorelease];

现在输入代码来测试所有内容 - queryqueryPathqueryURL - 如果值不符合您的预期,则会产生错误。问题应该变得明显。

答案 1 :(得分:2)

我想出来了!

好的,这就是故事和解决方案:      我正在制作一个天气应用程序,查询需要一个城市才能获得带有数据的有效XML文件。在我的模拟器中,位置是关闭的,所以它把我放在加利福尼亚州格伦代尔?你可以看到 Glendale是单词。因此,当它进入查询时,它作为有效的URL传递,并获得数据。当我打开手机测试时,我收到了上述错误!这是因为我居住的地方,从CLGeocoder的reverseGeocodeLocation检索的城市名称是2个单词。 (即得梅因)。中间的空间搞砸了所有事情。显然,在URL中放置空格不会让你获得任何数据。为了在“XML吐出服务”中获得空间,我使用的是必须使用 a + sign 。所以经过大约4个小时的调试后,我发现了这一点,我把它放进去了:

 stringByReplacingOccurrencesOfString:@" " withString:@"+"

在我的方法结束时,所以最终它看​​起来像这样:

 City = [[placemark locality] stringByReplacingOccurrencesOfString:@" " withString:@"+"];

这解决了它,现在空间可以用加号替换,因此给我实际数据!祝所有遇到类似问题的人好运!