代码之家  ›  专栏  ›  技术社区  ›  Oh Danny Boy

iPhone:错误和错误处理比较混乱

  •  0
  • Oh Danny Boy  · 技术社区  · 14 年前
    NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];
    
    if(results == nil){
        NSLog(@"No results found");
        searchObj = nil;
    }else{
        if ([[[results objectAtIndex:0] name] caseInsensitiveCompare:passdTextToSearchFor] == 0) {
            NSLog(@"results %@", [[results objectAtIndex:0] name]);
            searchObj = [results objectAtIndex:0];
        }else {
            NSLog(@"No results found");
            searchObj = nil;
        }       
    }
    

    上面的代码将用户输入的数据与从数据库中提取的数据进行比较。如果我输入数据库中的数据,它就会工作。但是如果我输入完整的胡言乱语,它会返回下面的错误而不是“找不到结果”。

    *** WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSRangeException> *** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)
    

    检查上述代码时,应考虑结果数组为空,否?

    1 回复  |  直到 14 年前
        1
  •  3
  •   randombits    14 年前

    您可能会在以下代码行上引发异常:

    if ([[[results objectAtIndex:0] name] caseInsensitiveCompare:passdTextToSearchFor] == 0)

    如果数组已初始化且元素为零,则将通过nil检查,但在尝试访问数组本身中的任何对象时将引发异常。

    - (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error 无法返回空数组。你应该用NSARRAY的 count 方法,而不是检查数组是否为零。

    我建议您在objc_Exception抛出和[nsException引发]上设置断点,并帮助您调试应用程序。然后在gdb中运行一个回溯,查看异常在哪里被抛出,以进一步诊断真正的问题。

    克里斯·汉森写了一篇关于如何完成上述任务的好文章 here