Ну, я думаю, это можно описать, используя очень надуманный пример. Допустим, у вас есть метод в Java, который распечатывает все элементы в ArrayList:
void foo(ArrayList list)
{
for(int i = 0; i < list.size(); ++i){
System.out.println(list.get(i).toString());
}
}
Теперь, если вы вызываете этот метод следующим образом: someObject.foo (NULL); вы, вероятно, получите исключение NullPointerException при попытке доступа к списку, в данном случае при вызове list.size (); Теперь вы, вероятно, никогда бы не вызвали someObject.foo (NULL) с таким значением NULL. Однако вы, возможно, получили свой ArrayList от метода, который возвращает NULL, если он сталкивается с некоторой ошибкой, генерирующей ArrayList, например someObject.foo (otherObject.getArrayList ());
Конечно, у вас также будут проблемы, если вы сделаете что-то вроде этого:
ArrayList list = NULL;
list.size();
Теперь в Objective-C у нас есть эквивалентный метод:
- (void)foo:(NSArray*)anArray
{
int i;
for(i = 0; i < [anArray count]; ++i){
NSLog(@"%@", [[anArray objectAtIndex:i] stringValue];
}
}
Теперь, если у нас есть следующий код:
[someObject foo:nil];
у нас такая же ситуация, когда Java создаст исключение NullPointerException. Сначала к объекту nil будет получен доступ в [anArray count]. Однако, вместо того, чтобы выдавать исключение NullPointerException, Objective-C просто вернет 0 в соответствии с приведенными выше правилами, поэтому цикл не будет выполняться. Однако, если мы установим цикл на выполнение заданного числа раз, то сначала мы отправим сообщение в anArray в [anArray objectAtIndex: i]; Это также вернет 0, но поскольку objectAtIndex: возвращает указатель, а указатель на 0 равен nil / NULL, NSLog будет пропущен nil каждый раз через цикл. (Хотя NSLog является функцией, а не методом, он выводит (ноль), если передан ноль NSString.
В некоторых случаях лучше иметь исключение NullPointerException, поскольку вы можете сразу сказать, что с программой что-то не так, но если вы не уловите исключение, программа завершится сбоем. (В C попытка разыменования NULL таким способом приводит к сбою программы.) В Objective-C вместо этого это просто вызывает, возможно, некорректное поведение во время выполнения. Однако, если у вас есть метод, который не прерывается, если он возвращает 0 / nil / NULL / нулевую структуру, то это избавляет вас от необходимости проверять, чтобы убедиться, что объект или параметры равны nil.