Исключение NSRangeException за пределами неперехваченного исключения

#objective-c #cocoa

#objective-c #cocoa

Вопрос:

Я выполняю руководство и получаю приведенную ниже ошибку.

Мой код:

 #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;
}
  

Ошибка:

 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)
  

Как вы можете догадаться, я изучаю разработку cocoa из Big Nerd Ranch Cocoa® Programming for Mac® OS X (3rd Edition) , которая точно не обновлена для XCode 4.2

Не уверен, почему мой индекс будет за пределами границ или что именно это означает. Спасибо.

Ответ №1:

У вас есть два экземпляра одной и той же опечатки:

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

Удалите их ; в конце for строк. Как есть, вы не выполняете никаких инструкций внутри этих двух for циклов. То, что вы написали, эквивалентно:

 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);
}
  

Ответ №2:

В дополнение к обычному ответу, я предлагаю вам в качестве общего правила использовать блоки @try / @catch при использовании objectAtIndex: selector (этот метод может вызывать исключение), таким образом, вы обеспечите соблюдение своего кода, и ваше приложение не зависнет. Итак:

 @try {

    [array addObject:newNumber];

} @cacth (NSException *exception) {

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

Комментарии:

1. Спасибо. Это буквально моя вторая программа Cocoa, но я добавил ее в свой код. Хорошая концепция для использования.