【问题标题】:Terminating the app due to uncaught exception in Objective-C for iPhone app由于 Objective-C for iPhone 应用程序中未捕获的异常而终止应用程序
【发布时间】:2011-01-14 05:50:00
【问题描述】:

我在 Objective-C 中写了一个 for 循环,这就是我的代码的样子

NSString *string = [NSString stringWithContentsOfFile=@"/Users/Home/myFile.doc"];
NSString *seperator=@"\n";
NSArray *mainarray = [string componentsSeparatedByString:seperator];
// Since i want to parse each element of mainarray
for(NSString *s in mainarray)
{
  //again parising the string using a new separator
    NSString newseparator = @"=";
    NSArray *subarray = [s componentsSeparatedByString : newseparator];

  //Copying the elements of array into key and object string variables

    NSString *key = [subarray objectAtIndex:0];
    NSLog(@"%@",key);
    NSString *class_name= [subarray objectAtIndex:1];
    NSLog(@"%@",class_name);

   // create an instance for the class_name
      //dont knw how it ll take the value from file and ???  

 //Putting the key and objects values into hashtable 
    NSMutableDictionary = [NSDictionary dictinaryWithObject:class_name forKey:key];
}

每当我执行此代码时,我的程序都会崩溃,因为未捕获的异常 NSRangeException 而终止应用程序

如何知道数组的范围以及如何在for循环中指定终止条件???请告诉我如何处理这个异常???

【问题讨论】:

    标签: objective-c arrays exception-handling for-loop


    【解决方案1】:

    我很惊讶代码甚至可以编译。如果我没记错的话,除非您竭尽全力关闭一大堆编译器警告,否则它无法编译。

    NSString newseparator = @";";
    

    这应该会给出一个错误,因为你没有*。

    NSString *key = [subarray objectAtIndex[0]];
    NSString *object = [subarray objectAtIndex[1]];
    

    这两行代码都没有任何意义。

    看来您还没有发布实际代码?


    现在,回到异常。如果您尝试访问位于数组中可用索引范围之外的索引处的项目,则会抛出范围异常。因此,如果 componentsSeparatedByString: 返回一个包含 0 或 1 个元素的数组,那么 [subarray objectAtIndex: 1]; 将引发范围异常。

    想要做的是尝试使用@catch 块来处理异常。在 Cocoa(和 iPhone 开发)中,异常被视为不可恢复的错误。

    因此,请改为在 NSArray 上使用 -count 方法来验证数组是否实际包含您所期望的元素数。由于您正在编写一个随意的解析器,这可能是一个对输入有效性进行最小检查的好主意。

    【讨论】:

    • 我该如何处理这个异常?有什么方法可以检查数组的范围。像 ** if(s!=nil)** ,但即使这样对我也没有任何影响。
    • 不用担心,只是让回答变得更加困难,而且您往往会获得比您需要的更多指向 Objective-C 教程的指针。 :) 答案已编辑。
    • 好的,我将使用 -count 方法对数组元素进行计数。但是如何将其添加为 for 循环中的终止条件?解析所有数组元素,将其转换为字符串并更新我的哈希表 如何使控件脱离 for 循环?
    • 鉴于subarray 派生自mainarray,您似乎不太可能希望根据子数组的内容终止循环。也就是说,除非您认为mainarray 中的一个元素实际上是不完整的。在任何情况下,您都可以在 C 中使用 break 关键字来跳出 @9​​87654331@ 循环。
    • 嗨,bbum,在每次迭代中我都需要实例化一个类,其中 NSString *object = [subarray objectAtIndex:1];,对象将保存类的内容姓名。现在对于每次迭代,我都需要为该类创建一个对象。我的问题是如果我这样做,object *obj = [[object alloc]init];。它如何将 object 的值替换为其类名?对于每次迭代,值都是从上面写的文件访问代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多