Другое событие 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));
}
Как Guido говорит в его , судьба уменьшает () в сообщении Python 3000 :
Поэтому теперь уменьшают (). Это - на самом деле то, которое я всегда ненавидел больше всего, потому что, кроме нескольких вовлечения в качестве примера + или *, почти каждый раз я вижу уменьшение () вызов с нетривиальным аргументом функции, я должен захватить перо и бумагу для схематического изображения то, что на самом деле питается в ту функцию, прежде чем я пойму то, что уменьшение (), как предполагается, делает. Таким образом в моем уме, применимость уменьшает (), в значительной степени ограничен ассоциативными операторами, и во всех других случаях лучше выписать цикл накопления явно.
существует превосходный пример путания reduce
в статья Functional Programming HOWTO :
Быстрый, что делает следующий код?
total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
можно понять его, но это занимает время для распутывания выражения для выяснения то, что продолжается. Используя короткое вложенное определение операторы делает вещи немного лучше:
def combine (a, b): return 0, a[1] + b[1] total = reduce(combine, items)[1]
, Но было бы лучше из всех, если я просто использовал для цикла:
total = 0 for a, b in items: total += b
Или сумма () встроенный и выражение генератора:
total = sum(b for a,b in items)
Много использования уменьшают (), более ясны, когда записано что касается циклов.
reduce()
не удаляется - это просто перемещается в functools
модуль. Обоснование Guido состоит в том, что за исключением тривиальных случаев как суммирование, кодируйте записанное использование reduce()
, обычно более ясно, когда записано как цикл накопления.
Люди волнуются, что это поощряет запутываемый стиль программирования, делая что-то, что может быть достигнуто с более четкими методами.
я не против, уменьшают меня, я также нахожу его полезным инструментом иногда.