У меня было странное и неожиданное поведение на java HashMap, часть кода, предназначенная исключительно для тестирования.Могу ли я иметь непустую хэш-карту без ключей?
Чтобы попытаться установить уникальный идентификатор объекта перед его сохранением в сеансе, я использую оператор if{}else{}
, но я обнаружил ошибку в своем приложении.
Идентификатор создается для тестовых целей, так как в настоящее время нет базы данных для фактического хранения данных, которые хранятся в сеансе тем временем.
Вот мой фрагмент кода:
...
HttpSession session = request.getSession();
Map<Integer, Booking> bookings = (HashMap<Integer, Booking>) session.getAttribute(SESSION_BOOKINGS);
// Generates ID
if (bookings == null)
{
bookings= new HashMap<Integer, Booking>();
identificator = 1;
}
else
{
Object[] arrayKeys = (Object[]) bookings.keySet().toArray();
Arrays.sort(arrayKeys);
identificator = (Integer) arrayKeys[arrayKeys.length - 1] + 1;
}
...
//... The rest is setting the ID to the current worked on booking,
//... putting the ID/booking pair in the bookings map
//... and storing the map in session, which worked fine
ошибка пришла после удаления номер на карте, когда карта содержала только один. Когда я пытался зарегистрировать еще один после этого, я получил сообщение об ошибке со следующей причиной ошибки java.lang.ArrayIndexOutOfBoundsException: -1
и следом, связанным с последней строкой моего else
заявления: identificator = (Integer) arrayKeys[arrayKeys.length - 1] + 1;
Итак:
arrayKeys.length -1 == -1 // true
- это означает, что
arrayKeys.length == 0 // true
, который в свою очередь означает, что
keySet()
отMap<Integer,Booking> bookings
пустпока тест не входит в
if
заявление
С другой стороны, на новой сессии (либо после перезапуска браузера или выхода из системы и снова), тест сделал ввести если заявление как ожидается.
После тестирования I сменил телефон с (bookings==null)
на (bookings==null || bookings.isEmpty())
.
Дальнейшие испытания показали, что использование только (bookings.isEmpty()
приводит к NPE при регистрации бронирования на новом сеансе.
Так что мне было интересно, если бы карта была не нулевой, без значения в ней (очевидно, да, но я также спрашиваю себя, как), и почему она не вернулась к null после он был полностью опустошен?
И хотя я понимаю, что после заявления new
, как это происходит после звонка session.getAttribute()
? Это кажется очевидным, так как карты еще не сохранены в сеансе, но в то же время кажется странным, поскольку не было new
.