Ali Sufyan
Ali Sufyan

Reputation: 2046

'NSRangeException' while reading data from a file

I am trying to save data when the home button is pressed. Here is my relevant code.

   - (NSString *) saveFilePath
{
    NSArray *path =
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    return [[path objectAtIndex:0] stringByAppendingPathComponent:@"savefile.plist"];

}
- (void)applicationDidEnterBackground:(UIApplication *)application {
     NSArray *values = [[NSArray alloc] initWithObjects:
                   [NSNumber numberWithInt:askedQuestions],  //for questionLabel
                   [NSNumber numberWithInt:timeMin],         //timeMin
                   [NSNumber numberWithInt:timeSec],         //timeSec
                   [NSNumber numberWithInt:skipCount],       //skipped question
                   [NSNumber numberWithInt:correctAnswers],   //corectAnswers
                   nil];
[values writeToFile:[self saveFilePath] atomically:YES];
 }

saveFilePath method is providing the file path.

And in viewDidLoad

NSString *myPath = [self saveFilePath];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:myPath]; 
if (fileExists)
{
    NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath];
    _readerLabel.text = [[values objectAtIndex:0] stringValue];
    askedQuestions=[[values objectAtIndex:0] intValue];
    timeMin=[[values objectAtIndex:1]intValue];
    timeSec=[[values objectAtIndex:2]intValue];
    skipCount=[[values objectAtIndex:3]intValue];
    correctAnswers=[[values objectAtIndex:4]intValue];

}

UIApplication *myApp = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidEnterBackground:)
 name:UIApplicationDidEnterBackgroundNotification
 object:myApp];

and i am getting this:

Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFArray objectAtIndex:]:        index (0) beyond bounds (0)'
*** First throw call stack:
(0x16a1012 0x13aee7e 0x16a0deb 0x16957e0 0x6891 0x312d 0x305817 0x305882 0x254a25 0x254dbf 0x254f55     0x25df67 0x221fcc 0x222fab 0x234315 0x23524b 0x226cf8 0x2703df9 0x2703ad0 0x1616bf5 0x1616962 0x1647bb6   0x1646f44 0x1646e1b 0x2227da 0x22465c 0x26cd 0x25f5)
libc++abi.dylib: terminate called throwing an exception

Where is the problem in the code. Please help!

Upvotes: 1

Views: 113

Answers (1)

deanWombourne
deanWombourne

Reputation: 38475

You're not checking to see if anything has worked!

What happens if

NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath];

either fails (the file might not exist) or if it returns an array with 0 items in?

You need to add something like :

NSArray *values = [[NSArray alloc] initWithContentsOfFile:myPath];
if (values.count > 0) {
  ...
}

You should also set a breakpoint on applicationDidEnterBackground: and step though to make sure that your save method is working as you expect.


Also, I suspect one of these two lines is wrong :

_readerLabel.text = [[values objectAtIndex:0] stringValue];
askedQuestions=[[values objectAtIndex:0] intValue];

they're both asking for the item at index 0

Upvotes: 1

Related Questions