2011-03-25 90 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