由于未捕获的异常“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