在iOS上“因未捕获的异常而终止应用程序”

时间:2011-02-11 05:11:02

标签: iphone objective-c ios xcode cocoa-touch

我的代码中有一个for循环。 当for循环的执行继续时,我的应用程序崩溃并在控制台上打印以下消息:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[NSMutableArray objectAtIndex:] index 2 beyond bounds [0 .. 1]'  Call stack at first throw:

使用此for循环我正在尝试填充NSMutableArray,但这不是正在完成的工作。

3 个答案:

答案 0 :(得分:14)

通常,当您尝试访问NSArray范围之外的索引处的元素时会发生这种情况。

所以说你有NSArray这样:

NSArray *a = [NSArray arrayWithObjects:@"a", @"b", @"c", nil];

此代码将打印“数组索引超出范围”,因为边界为0 - 2:

@try {
   NSString *string = [a objectAtIndex:3];
} @catch(NSRangeException *e) {
   NSLog(@"Array index out of bounds");
}

解决此问题的最佳方法是使用快速枚举

for(id obj in array) {
   //do something with obj
}

快速枚举使用可枚举对象的NSFastEnumeration协议实现来处理所有脏工作。

即使在使用快速枚举时通常会导致此问题的一件事是,如果要枚举可变结构(例如NSMutableArray并且在循环体内),则使用{{1}来改变结构或者它的变体,你将很快遇到这个异常,因为结构的长度被缓存,因此它将继续进行下一次迭代,即使它超出界限。

但是,使用快速枚举,您将很快捕获此错误,因为内部removeObject:将捕获它并引发以下异常:

__NSFastEnumerationMutationHandler

答案 1 :(得分:1)

您的异常暗示您正在尝试访问数组中超出范围的内容(超出边界的索引2)。如果你只需要访问数组,最好的办法是使用快速枚举(对于每个循环)。

for (NSString *str in array)
    NSLog(@"%@", str);

这样的事情可以防止任何索引超出范围的例外。

答案 2 :(得分:1)

异常类型称为索引超出范围的异常。当您尝试访问不存在的数组元素时,通常会发生这种情况。