0

I'm having this problem where I keep getting this error in my console:

* Terminating app due to uncaught exception 'NSRangeException', reason: '* -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array'

Here is my code for retrieving the data from the XML document:

CXMLDocument *worldweather = [[CXMLDocument alloc]initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://free.worldweatheronline.com/feed/weather.ashx?q=%@&format=xml&num_of_days=4&key=0ded69e02b171832121504",query]] options:0 error:nil];

weathercondition = [[[worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil] objectAtIndex:0] stringValue];

The location that Xcode is using is Williams, CA and the query sent is

Williams+CA

When I plug this into my URL, it works and I get my XML file, but why am I getting this message in my console???

This is driving me crazy. All help would be GREATLY appreciated! Thanks in advance!

sridvijay
  • 1,526
  • 18
  • 39
  • Let me know what you get if you do NSLog(@"class: %@", [[worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil] class]); – Ladislav Jun 20 '12 at 00:10
  • This is my console right now: 2012-06-19 20:17:38.441 Forecaster[10795:c07] Williams+CA 2012-06-19 20:17:38.799 Forecaster[10795:630b] ( ) 2012-06-19 20:17:38.799 Forecaster[10795:630b] elements in Array: 0 2012-06-19 20:17:38.800 Forecaster[10795:630b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array' – sridvijay Jun 20 '12 at 00:18
  • I know, but add before you have weather condition = ... just add my line NSLog(@"class: %@", [[worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil] class]); and let me know what the console outputs now – Ladislav Jun 20 '12 at 00:21
  • My bad! Sorry about that. Here it is: 2012-06-19 20:58:35.975 Forecaster[11460:5f0b] class: __NSArrayI – sridvijay Jun 20 '12 at 00:59
  • OK, now replace that NSLog with this one: NSLog(@"array returned: %@", [worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil]); – Ladislav Jun 20 '12 at 01:01
  • This is what I got: 2012-06-19 21:02:53.511 Forecaster[11550:6307] array returned: ( ) There's a huge space between the parentheses though, if that means anything! – sridvijay Jun 20 '12 at 01:03
  • let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/12771/discussion-between-programmer20005-and-ladislav) – sridvijay Jun 20 '12 at 01:04

1 Answers1

3

Seems that you think that [worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil] is NSArray with at least one object inside the array. This is clearly not the case, and you get an error saying that there is no object at index 0, which means that array is empty.

If you are not sure there is at least one object inside an NSArray do not just call objectAtIndex:0.

You could first check how many elements are there in array and then do the work like:

NSArray *weatherArray = [worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil];

if ([weatherArray count] > 0){
  weathercondition = [[weatherArray objectAtIndex:0] stringValue];
}

If you are not sure what you are getting back from the server, see what is in the array:

NSLog(@"%@", weatherArray);

or check how many elements there are:

NSLog(@"elements in Array: %i", [weatherArray count]);

One additional useful thing you can use is for example [weatherArray lastObject], this will always return the last element of the array and will return nil even if the array is empty (it will not crash like objectAtIndex:0)

Ladislav
  • 7,223
  • 5
  • 27
  • 31
  • The thing that is driving me nuts is that if you put this in Safari: http://free.worldweatheronline.com/feed/weather.ashx?q=Williams+CA&format=xml&num_of_days=4&key=0ded69e02b171832121504, there is an object! I don't know why it's saying that there is no object? It worked before and then now randomly this NSRangeException is coming – sridvijay Jun 20 '12 at 00:20
  • Just let me know what you get if you input stuff I put in the comment below your question...I cannot help you without you sharing me some info – Ladislav Jun 20 '12 at 00:24
  • I solved it. Turns out the query was coming from another View Controller, so all the query editing that I was doing before you helped me was going to nowhere. I can't thank you enough for your help. I did learn some new ways to debug my code! Thank you! – sridvijay Jun 20 '12 at 03:15