Другое событие 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));
}
удар (в отличие от POSIX sh) поддерживает массивы:
fruits=(apple orange kiwi "dried mango")
for fruit in "${fruits[@]}"; do
echo "${fruit}"
done
Это имеет преимущество, что элементы массива могут содержать пробелы или других членов $IFS; пока они были правильно вставлены как отдельные элементы, они считаны тот же путь.
Как это:
FRUITS="apple orange kiwi"
for FRUIT in $FRUITS; do
echo $FRUIT
done
Уведомление это не будет работать, если будут пробелы на названия Ваших фруктов. В этом случае см. этот ответ вместо этого, который является немного менее портативным, но намного более устойчивым.
Теперь, когда ответ, который я люблю, был принят как корректный ответ, я теперь перемещусь в другую тему: как использовать IFS
для личной выгоды.:-P
fruits="apple,orange,kiwifruit,dried mango"
(IFS=,
for fruit in $fruits; do
echo "$fruit"
done)
я поместил код в скобках так, чтобы эти IFS
изменение было изолировано в его собственный подпроцесс; таким образом в конце раздела на кронштейнах, IFS
вернулся назад к его старому значению.:-)