由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围”
Posted
技术标签:
【中文标题】由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围”【英文标题】:Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array' 【发布时间】:2014-06-25 11:14:27 【问题描述】:我正在使用 Web 服务开发应用程序时遇到这样的错误,它是在我测试真实设备时发生的,但是当我运行视网膜 3.5 模拟器时,它运行良好,请帮助我,我已经尝试过,但我无法解决这个问题。
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
*** First throw call stack:
(0x30b59fd3 0x3b308ccf 0x30a9081b 0xeec19 0x334a8917 0x3344fc47 0x3344f49d 0x33375d79 0x32ff362b 0x32feee3b 0x32feeccd 0x32fee6df 0x32fee4ef 0x33379401 0x30b2525b 0x30b2472b 0x30b22f1f 0x30a8df0f 0x30a8dcf3 0x35992663 0x333d916d 0x100ec1 0x3b815ab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
代码:
-(void)loaddetails
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://api.espn.com/v1/sports/football/news/headlines?apikey=th98vzm67pufc36ka42xxxmy"]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json;charset=UTF-8" forHTTPHeaderField:@"content-type"];
NSError *err;
NSURLResponse *response;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSDictionary *jsonArray=[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&err];
NSArray *headlinetop=[jsonArray objectForKey:@"headlines"];
for (int i=0; i<[headlinetop count]; i++)
NSString *headstr=[[headlinetop objectAtIndex:i]objectForKey:@"headline"];
[loadingcell addObject:headstr];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(10, 10.0, 250, 26.0)];
title.backgroundColor = [UIColor clearColor];
title.textAlignment = NSTextAlignmentLeft;
title.textColor=[UIColor blackColor];
title.font = [UIFont fontWithName:@"Arial Hebrew" size:15.0];
title.text=[loadingcell objectAtIndex:indexPath.row];
[cell.contentView addSubview:title];
if ([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone)
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
return cell;
【问题讨论】:
显示你的代码,找出它崩溃的那一行。你的数组是空的,你在某处做[yourArray objectAtIndex:0]
。
发布符号化的堆栈跟踪和相关代码。
您正在尝试访问一个空数组。您的 Web 服务可能没有停用任何内容,但您仍在尝试访问结果。
不要在评论中显示我们的代码。编辑您的问题以添加代码。
【参考方案1】:
为了理解访问数组对象的概念,这里我想出了一个例子,它清楚地解释了为什么当你访问数组中的索引处的对象时它会崩溃。
我不会指出你在哪里犯了错误。理解这个概念并在此基础上更改任何你有的代码,比如[yourArray objectAtIndex:10]
。
非软件示例:
你有 bag(NSMutableArray) ,它有 10 个标记为 (0,1,2...9) 的球,但是你如何找出第 11 个球。不可能!。
1.首先你应该准备好手上的包。([[NSMutableArray alloc] init]
)
2.然后尝试访问它。
3.您的问题是您正在寻找袋子内的第一个球(第 0 个标记)。 ios 说“对不起”
//assume [array count] == 10 (0,1,2,3,4,5,...9)
NSUInteger indexTobeAccessedInArray = 5;//6th object (0,1,2,3,4,5,...9)
if (array && [array count]>0)
// array lives in memory and it has atleast one objects in it
// 5 < 10
if (indexTobeAccessedInArray < [array count])
//Yes
NSLog(@"you can access this index:%i",indexTobeAccessedInArray);
else
//No
NSLog(@"Index %i beyond bounds for array",indexTobeAccessedInArray);
else
// There was no array in memory
NSLog(@"sorry there is no array, you should create & initialize it first like \n NSMutableArray *array = [[NSMutableArray alloc]init]");
【讨论】:
感谢您提供有关数组的信息,但我之前可以在此处访问数组,但现在显示为空 如果有人反对我的回答,如果您能添加一些 cmets,我将不胜感激。所以我会努力纠正自己。感谢匿名。【参考方案2】:你可以试试:
id myObject = [myArray firstObject];
if(nil != myObject)
// Do something
但是如果不向我们展示代码,我真的无法再提出建议了。
【讨论】:
我建议检查计数而不是数组是否为零。 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"api.espn.com/v1/sports/boxing/news/…; [request setHTTPMethod:@"GET"]; [request setValue:@"application/json;charset=UTF- 8" forHTTPHeaderField:@"content-type"]; NSError *err; NSURLResponse *response; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returnedResponse:&response error:&err]; NSDictionary *jsonArray=[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers 错误:&err]; NSArray *headlinetop=[jsonArray objectForKey:@"headlines"]; for (int i=0; i a UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(10, 10.0, 250, 26.0)]; title.backgroundColor = [UIColor clearColor]; title.text=[loadingcell objectAtIndex:indexPath.row];【参考方案3】:您可以使用行数委托方法来解决问题。如果 loadingcell 数组为空。然后单元格将加载空行..
loadingcell=[[NSMutableArray alloc]init];//check that you initialized and allocated loadingcell
如下修改你的代码..
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return loadingcell.count;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
if(loadingcell.count>0)
UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(10, 10.0, 250, 26.0)]; title.backgroundColor = [UIColor clearColor];
title.textAlignment = NSTextAlignmentLeft;
title.textColor=[UIColor blackColor]; title.font = [UIFont fontWithName:@"Arial Hebrew" size:15.0];
title.text=[loadingcell objectAtIndex:indexPath.row];
[cell.contentView addSubview:title];
if ([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone)
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
return cell;
希望对你有帮助..
【讨论】:
以上是关于由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围”的主要内容,如果未能解决你的问题,请参考以下文章
由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围”
由于未捕获的异常“NSRangeException”而终止应用程序,原因:-[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围
由于未捕获的异常“NSRangeException”而终止应用程序,原因:“-[__NSCFArray objectAtIndex:]: index (14) beyond bounds (14)”
由于未捕获的异常“NSRangeException”而终止应用程序,原因:-[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围-2
*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0
*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds fo