NSRangeException超出了未捕获的异常范围

时间:2011-11-07 07:56:35

标签: 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)

你可以猜到我正在学习可可用于Big Nerd Ranch Cocoa® Programming for Mac® OS X (3rd Edition)的{​​{1}},而XCode 4.2尚未完全更新

不确定为什么我的索引超出界限或究竟是什么意思。感谢。

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

除了Bavarious响应之外,我建议您在使用objectAtIndex:selector时使用@ try / @ catch块作为一般规则(该方法可以抛出异常),这样您将强制执行代码并赢得应用程序不要冻结。所以:

@try {

    [array addObject:newNumber];

} @cacth (NSException *exception) {

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