Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Вот то, что я говорил Нейту Куку, в комментариях к его качественному ответу. Это то, что я считаю «легким [добавлением] элементов в массив внутри словаря»:
dict["key"] = dict["key"]! + 4
dict["key"] = dict["key"] ? dict["key"]! + 4 : [4]
Сейчас нам нужно определить оператор + самостоятельно.
@infix func +<T>(array: T[], element: T) -> T[] {
var copy = array
copy += element
return copy
}
Я думаю, что эта версия снимает слишком много безопасности; Может быть, определить его с помощью составного оператора?
@infix func +<T>(array: T[]?, element: T) -> T[] {
return array ? array! + element : [element]
}
dict["key"] = dict["key"] + 4
Наконец, это самое чистое, что я могу получить, но я не совсем понимаю, как работают значения / ссылки на массивы в этом примере.
@assignment func +=<T>(inout array: T[]?, element: T) {
array = array + element
}
dict["key"] += 5