ian
ian

Reputation: 12335

NSRangeException beyond bounds uncaught exception

I am doing a tutorial and getting the below error.

My code:

#import  <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    @autoreleasepool
    {

    NSMutableArray *array;
    array = [[NSMutableArray alloc] init];
    int i;
    for( i = 0; i < 10; i++); 
    {
        NSNumber *newNumber;
        newNumber = [[NSNumber alloc] initWithInt:(i * 3)];
        [array addObject:newNumber];
    }


    for( i = 0; i < 10; i++);
    {
        NSNumber *numberToPrint;
        numberToPrint = [array objectAtIndex:i];
        NSLog(@"The number at index %d is %@", i, numberToPrint);
    }
    }
    //[pool drain];
    return 0;
}

Error:

GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".tty /dev/ttys000
[Switching to process 26323 thread 0x0]
2011-11-06 21:46:26.506 lottery[26323:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff976d9286 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff932a3d5e objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff976669f2 -[__NSArrayM objectAtIndex:] + 274
    3   lottery                             0x0000000100000e49 main + 345
    4   lottery                             0x0000000100000ce4 start + 52
    5   ???                                 0x0000000000000001 0x0 + 1
)
terminate called throwing an exceptionsharedlibrary apply-load-rules all
(gdb)

As you can guess I am learning cocoa working out of the Big Nerd Ranch Cocoa® Programming for Mac® OS X (3rd Edition) which is not exactly updated for XCode 4.2

Not sure why my index would be beyond bounds or what exactly that means. Thanks.

Upvotes: 0

Views: 2725

Answers (2)

daveoncode
daveoncode

Reputation: 19578

In addition to Bavarious response, I suggest you as a general rule to use @try/@catch blocks when you use objectAtIndex: selector (that method can throw exception), in this way you will enforce your code and your app won't freeze. So:

@try {

    [array addObject:newNumber];

} @cacth (NSException *exception) {

    NSLog(@"catched error: %@", exception.description);
}

Upvotes: 1

user557219
user557219

Reputation:

You have two instances of the same typo:

for( i = 0; i < 10; i++);

Remove those ; at the end of the for lines. As is, you’re executing no instructions inside those two for loops. What you’ve written is equivalent to:

for( i = 0; i < 10; i++)
{
}

{
    NSNumber *newNumber;
    newNumber = [[NSNumber alloc] initWithInt:(i * 3)];
    [array addObject:newNumber];
}

for( i = 0; i < 10; i++)
{
}

{
    NSNumber *numberToPrint;
    numberToPrint = [array objectAtIndex:i];
    NSLog(@"The number at index %d is %@", i, numberToPrint);
}

Upvotes: 1

Related Questions