我的代码中有一个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
,但这不是正在完成的工作。
答案 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)
异常类型称为索引超出范围的异常。当您尝试访问不存在的数组元素时,通常会发生这种情况。