#java #string #object #null
#java #строка #объект #null
Вопрос:
У меня есть твиты, хранящиеся в базе данных MongoDB, и я извлекаю их для проведения некоторого анализа.
В этом случае я просматриваю хэштеги, связанные с твитом, и использую следующий код:
BasicDBList hts = (BasicDBList)obj.get(Constants.HASHTAGS_STR);
if (!hts.isEmpty())
tb.setHashtags(hts.toArray(new String[0]));
Это работает отлично… пока я не наткнулся на твит, в котором в качестве хэштега использовалось слово «null».
В этом случае hts-массив будет:
[ null ]
Хэштеги хранятся во внутреннем наборе дерева, и вставка завершается ошибкой при сравнении. Я не хочу отбрасывать этот хэштег, сравнивая его с null — есть ли лучший обходной путь?
Строковый литерал «null» хранится в базе данных. Проблема возникает, когда BasicDBList считывает ее как объект, и этот объект преобразуется в строку. Строка становится нулевой строкой вместо строки «null». Я хочу понять, как правильно интерпретировать данные, чтобы
tb.setHashtags()
приводит к тому, что tb имеет связанный с ним хэштег «null» вместо выдаваемой ошибки.
Комментарии:
1. Ухх,
"null"
(строка) не являетсяnull
значением. Строка из 4 букв будет работать просто отличноequals
.2. В строке нет ничего особенного
"null"
, просто сравните ее, как и любую другую строку.3. Кроме того,
new String[0]
это пустой массив, а не null.4. @shmosel К чему ты клонишь? Эллиот совершенно прав. Коллекции. toArray() этого не меняет.
5. @EJP Эллиот, похоже, говорит, что массив не может не содержать
null
элемент, если он пуст. Я хотел сказать, что передача пустого массива не обязательно означает, что вы получите пустой массив.
Ответ №1:
Проверьте, содержит ли список (BasicDBList) hts нулевые значения.
Метод toArray наследуется от ArrayList, который может возвращать массив, содержащий нулевые значения.
Взгляните на http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray (T[])
Комментарии:
1. Я включил содержимое BasicDBList выше. В тех случаях, когда список фактически содержит null, он отображается как [], а не [null]
2. вы используете экземпляр класса BasicDBList, который наследует метод toArray от ArrayList . В этом методе будет создан массив того же типа, что и отправленный параметр [here new String[0]], и его размер может варьироваться в зависимости от элементов списка. Количество элементов списка может не совпадать с длиной массива, поэтому оставшиеся индексы должны иметь значение null. Вам не нужно беспокоиться о строковом литерале «null», очевидно, что это строка.
3. для вашего понимания просто попробуйте проверить длину списка ‘hts’ и длину массива, возвращаемого ‘hts. toArray(новая строка [0])’
4. Я ценю объяснение, но вы упускаете мою мысль. Проблема в том, что фактическим значением в базе данных является строка «null». BasicDBList считывает объект. При преобразовании в строку он интерпретирует ее как нулевое значение вместо строкового литерала.