2011-03-25 56 views
0

即时通讯使用kumulos有权访问数据库。 这是我讲的是代码:objective-c iphone编程:尝试捕捉异常

NSString *location = [[theResults objectAtIndex:0] objectForKey:@"location"]; 

现在的事情,如果[theResults objectatindex:0]回报“空”,它崩溃每次 因此如果用户输入的东西是不是在数据库中它崩溃我想要抓住这个豁免(NSRange)。

谢谢

+1

如果[theResults objectAtIndex:0]是零,它不应该崩溃。所有应该发生的事情就是该位置本身变成零。 Objective-C允许每个[nil]任何方法调用,并且它们全部返回nil,因此仔细检查实际情况如何?我敢打赌,它不是,但随时给我惊喜:) – Kalle 2011-03-25 16:06:54

+0

是的。位置变成零,然后他尝试使用位置,我想,在一些代码中,最终试图取消引用指针:) – garph0 2011-03-25 16:09:29

+0

也可能是因为[theResults count] == 0而发生NSRangeException。 – Greg 2011-03-25 16:15:35

回答

4

我认为这将适用于你而无需异常处理。

if ([theResults count] > 0) { 
    NSString *location = [[theResults objectAtIndex:0] objectForKey:@"location"]; 
} 

我假设theResultsNSArray(或亚类)。

+0

如上所述,[nil foo]不会崩溃,它返回nil,所以您的建议不应该是必需的。问题是为什么他的代码首先崩溃。我认为,当他在一个不可或缺的情况下使用位置的时候,我可能会错误的。 – Kalle 2011-03-25 16:08:51

+0

如果(row!= nil)检查不是必需的,而且 - 如果row不存在,那么你的位置变量(可能在之后使用)将包含垃圾。所以你需要用nil初始化它,或者直接写NSString * location = [row objectForKey:@“location”];没有多余的检查 – Vladimir 2011-03-25 16:08:51

+1

我想你们都在寻找我的答案以前的编辑。我删除了不必要的行!=无检查已经。我认为代码崩溃是因为他正在处理一个空的theResults数组。 – Greg 2011-03-25 16:09:49

1

要么你检查[theResults objectAtIndex:0]不回零,或者你使用异常处理

@try { 
    NSString *location = [[theResults objectAtIndex:0] objectForKey:@"location"]; 
} 
@catch (NSRangeEception * e) { 
    NSLog(@"catching %@ reason %@", [e name], [e reason]); 
} 
@finally { 
    //something that you want to do wether the exception is thrown or not. 
} 

我会建议学习语言至少一点点,不过,还是实践与谷歌:-)

+1

你不*在iOS中使用异常处理来捕捉并处理和继续。框架抛出的异常表示通常由代码错误导致的不可恢复的错误。对于数组,如果存在内容问题,则使用'count'方法检查索引处是否存在对象,并且**从不**使用异常处理。 – bbum 2011-03-25 17:10:38

+0

这绝对不是要走的路。他所要做的就是检查[theResults count]是否为0. – Kalle 2011-03-25 17:42:19

+1

1.问题是:“我如何捕获NSRangeException”?答案是@try @catch,或者什么 2.如果你使用objectAtIndex的索引超出了限制,NSRangeException异常被抛出,而没有在代码中的一些灾难性的错误。您应该使用count,true,但我没有在@catch中看到那么大的错误。 3.鉴于这些前提,我认为两个沮丧是没有道理的,但谁在乎。 – garph0 2011-03-25 19:05:12