由于未捕获的异常“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-12-10 06:38:05 【问题描述】:

我是 ios 新手。我正在制作一个应用程序,在该应用程序中我得到了来自 json 的响应,一切正常。我将响应存储在一个数组中,但是当我像这样将数组值设置为 tableview 单元格时

valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"messageId"]

这是我所误解的一个例外。提前感谢。下面是我的示例代码。

-(void)viewdidload
  NSMutableDictionary *callDict =[[NSMutableDictionary alloc] init];
    [callDict setObject:@"messages-getModuleMessages" forKey:@"call"];
    [callDict setObject:FB_API_KEY forKey:@"accessSecret"];
    NSString *x=[FBUserManager sharedUserManager].authToken;
    [callDict setObject:x forKey:@"authToken"];
    [callDict setObject:@"json" forKey:@"format"];
    [callDict setObject:@"inbox" forKey:@"callType"];

    FBGenericWebHandler *handler = [[FBGenericWebHandler alloc] init];
    handler.delegate = self;
    [handler Inboxmessages:callDict];
    handler = nil;
    [MBProgressHUD showHUDAddedTo:self.view animated:YES];




我得到这样的回应

-(void)inboxmessagesGetSuccess:(FBGenericWebHandler*)handler response:(NSDictionary*)response

    [MBProgressHUD hideHUDForView:self.view animated:YES];
    NSMutableArray *inboxArray = [[NSMutableArray alloc] init];
   NSArray *firstarray=[[[response objectForKey:@"messageResponse"] objectAtIndex:1] objectForKey:@"messages"];
    for(NSDictionary *tmp in firstarray)
    
        NSMutableDictionary *messages=[[NSMutableDictionary alloc]init];
        [messages setValue:[tmp objectForKey:@"messageId"] forKey:@"messageId"];
        [self.inboxmessagesarray addObject:messages];




    
    [self.activitiesTableView_ reloadData];



并像这样设置我的单元格

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *tableviewidentifier = @"cell";
    tablecellTableViewCell *cell= [self.activitiesTableView_ dequeueReusableCellWithIdentifier:tableviewidentifier];

    if(cell==nil)
    
        cell = [[tablecellTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableviewidentifier];
    if(indexPath.row == [self tableView:tableView numberOfRowsInSection:indexPath.section] - 1)
        // [[cell textLabel] setText:@"Load more records"];
    

    UILabel *valuedate = (UILabel *)[cell viewWithTag:21];
    UILabel *msg = (UILabel *)[cell viewWithTag:22];
    UILabel *date = (UILabel *)[cell viewWithTag:23];
    UILabel *time = (UILabel *)[cell viewWithTag:24];
   valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"messageId"];
    return cell;

【问题讨论】:

你的numberOfRowsInSection:方法是什么? 另外,您的单元格是否定义为情节提要中的原型单元格?如果是这样,您可以跳过整个 if (cell==nil... 位。另外,我建议创建一个 UITableViewCell 子类并使用IBOutlet 属性,而不是搜索带有标签的视图。最后,使用传递给方法的tableView 比使用self.activitiesTableView_ 更简洁(并从属性中去掉尾随的_) 【参考方案1】:

它很简单,因为错误说“'NSRangeException',原因:-[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'”,你的数组是空的,你正试图访问它的第 0 个(即第一个元素) .

您可以做的是在检索值之前进行检查:if ([yourArray count] > 0)....

if (self.inboxmessagesarray.count > 0)
    valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"messageId"]

【讨论】:

嗯,但我怎样才能让这个数组在视图中加载为数组包含 20 个对象 嗯,但收件箱消息数组在 uitable 视图中为零,但作为响应,我正在获取对象.. 但是这些对象没有以 uitable 方法出现,为什么? 如果您的负载异步完成,这是可以预料的。这就是为什么我问你的numberOfRowsInSection 是什么 - 只要该方法返回 0,数组就可以为零 我正在定义部分中的行数返回 20【参考方案2】:

你可能有 self.inboxmessagesarray.count+1(加 1 用于加载更多)innumberOfRowsInSection: 方法和当 self.inboxmessagesarray.count == 0 那么你是valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"messageId"]; 这会引发此异常

【讨论】:

那么它将如何处理 if (self.inboxmessagesarray.count > 0) valuedate.text=[[self.inboxmessagesarray objectAtIndex:indexPath.row]objectForKey:@"messageId"]

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