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!

7
  • Let me know what you get if you do NSLog(@"class: %@", [[worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil] class]); Commented Jun 20, 2012 at 0: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' Commented Jun 20, 2012 at 0: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 Commented Jun 20, 2012 at 0:21
  • My bad! Sorry about that. Here it is: 2012-06-19 20:58:35.975 Forecaster[11460:5f0b] class: __NSArrayI Commented Jun 20, 2012 at 0:59
  • OK, now replace that NSLog with this one: NSLog(@"array returned: %@", [worldweather nodesForXPath:@"/data/current_condition/weatherIconUrl" error:nil]); Commented Jun 20, 2012 at 1:01

1 Answer 1

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)

Sign up to request clarification or add additional context in comments.

3 Comments

The thing that is driving me nuts is that if you put this in Safari: free.worldweatheronline.com/feed/…, 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
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
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!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.