首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS NSInvalidArgumentException:NSMutableArray 插入 nil 物件解決方案

     編輯:程式設計綜合問答

錯誤訊息

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '* -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

問題代碼

NSDictionary *dict = @{@"Testcase": Testcase, @"TestResult": TestResult, @"Message": Message};
NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray insertObject:dict atIndex:TestcaseId];

根本原因

字面語法 @{key: value} **若任一 value 為 nil,整個字典建立失敗,回傳 nil**。隨後將 nil 字典插入陣列即拋出異常。

排查步驟

  1. 加入斷點或 NSLog(@"dict = %@", dict); 確認哪個鍵對應 nil。
  2. 常見來源:Testcase、TestResult、Message 可能為未初始化的屬性、解析失敗的 JSON 欄位、或資料庫查無結果。

防禦性寫法

方案 A:三元運算子替換 nil 為空字串

#define SafeString(obj) ((obj) ? (obj) : @\"\")
dict = @{@"Testcase": SafeString(Testcase),
         @"TestResult": SafeString(TestResult),
         @"Message": SafeString(Message)};

方案 B:使用 NSParameterAssert 開發期攔截

NSParameterAssert(Testcase);
NSParameterAssert(TestResult);
NSParameterAssert(Message);
dict = @{@"Testcase": Testcase, @"TestResult": TestResult, @"Message": Message};

方案 C:建構器模式集中處理

- (NSDictionary *)buildDictWithTestcase:(NSString *)tc result:(NSString *)tr msg:(NSString *)msg {
    return @{@"Testcase": tc ?: @\"\",
             @"TestResult": tr ?: @\"\",
             @"Message": msg ?: @\"\"};
}

最佳實務

  • **所有進入集合(Array/Dictionary/Set)的物件,必須非 nil**。
  • 採用 obj ?: @\"\" 模式統一處理可選字串。
  • 單元測試覆蓋 nil 輸入情境。

記住:字面語法字典不容許 nil value,預先轉換為空字串或拋出斷言,徹底杜絕崩潰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved