Другое событие 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));
}
Будьте в спящем режиме/может поколение байт-кода использования (CGLIB) так, чтобы это знало, что поле грязно, как только Вы называете метод set (или даже присваиваете полю afaict).
Это сразу отмечает то поле/объект как грязное, но не сокращает количество объектов, которые должны быть грязно проверены во время сброса. Все, что это делает, повлиять на реализацию org.hibernate.engine.EntityEntry.requiresDirtyCheck()
. Это все еще делает сравнение поля полем для проверки на грязь.
я говорю вышеупомянутое на основе недавнего трала через исходный код (3.2.6GA) с любым доверием, которое добавляет. Интересные места:
SessionImpl.flush()
триггеры onFlush()
событие. SessionImpl.list()
вызовы autoFlushIfRequired()
, который инициировал onAutoFlush()
событие. (на таблицах процентов). Таким образом, запросы могут вызвать сброс. Интересно, никакой сброс не происходит, если нет никакой транзакции. AbstractFlushingEventListener.flushEverythingToExecutions()
, который заканчивается (среди других интересных местоположений) в flushEntities()
. source.getPersistenceContext().getEntityEntries()
) вызов DefaultFlushEntityEventListener.onFlushEntity()
. Будьте в спящем режиме берет снимок состояния каждого объекта, который загружается в Сессию. На сбросе каждый объект на Сессии по сравнению с ее соответствующим снимком для определения, которые грязны. SQL-операторы выпущены как требуется, и снимки обновляются для отражения состояния (теперь чистый) объекты Сессии.
Смотрите к org.hibernate.event.def. DefaultFlushEntityEventListener.dirtyCheck, который Каждый элемент на сессии переходит к этому методу, чтобы определить, грязно ли это или не путем сравнения нетронутой версии (один от кэша или один от базы данных).