Итак, я знаю, что МОЖЕТ иметь нулевой список (в частности, ArrayList). Теперь простая проверка для этого на самом деле генерирует исключение NullPointerException, когда я уже проверяю это. Это меня озадачило, так как я всегда использовал его успешно, но я уверен, что что-то упустил:
public class MyPost {
private int id;
private List<Label> labels;
public MyPost(int id){ this.id = id }
//getter setters for both plus this added method:
public void addLabel(Label aLabel)
{
if(labels == null)
labels = new ArrayList<Label>();
labels.add(aLabel);
}
}
Теперь в другой части моего кода я перебираю список идентификаторов, отправленных клиентом. Для простоты предположим, что переменная цикла 'i' предоставляет идентификаторы
MyPost aPost = new MyPost(i);
В моей логике я могу добавлять или не добавлять ярлыки к сообщению. Поэтому в конце, прежде чем продолжить, я проверяю наличие таких ярлыков:
if(aPost.getLabels()!=null)
//process labels
Теперь это вызывает исключение нулевого указателя, если ничего не было добавлено в список меток! Но это именно то, что я хочу проверить, и я все еще получаю NPE !!!
Я знаю, что aPost.getLabels () равен нулю, если к нему ничего не добавлено. Но сравнение кажется неудачным и выбрасывает NPE. Как решить эту проблему? Просто поставил меня в тупик!
UPDATE:
Вот код получения метки. Просто банальный добытчик ...
public List<Label> getLabels() { return labels;}
Мы заметили кое-что, что мы упустили раньше. Я уверен, что java использовал для «короткого замыкания» это условия if, то есть в условии ИЛИ, если первое условие оценивается как истинное, оно не проверяет второе (аналогичное короткое замыкание для И, если первое условие оценивается как ложное ). Я не совсем уверен, является ли это причиной, но вот предложение if:
if(aPost.getLabels()!=null || !aPost.getLabels().isEmpty())
//process labels
Если список действительно нулевой, короткое замыкание не должно оценивать второе условие, исправить ?? Кажется, что это может быть причиной, но мы все еще проверяем это. Пока только догадка ...