Если вы не инициализировали ссылочный тип и хотите установить или прочитать одно из его свойств, он будет генерировать исключение NullReferenceException.
Пример:
Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.
Вы можно просто избежать этого, проверив, является ли переменная не нулевой:
Person p = null;
if (p!=null)
{
p.Name = "Harry"; // Not going to run to this point
}
Чтобы полностью понять, почему выбрано исключение NullReferenceException, важно знать разницу между типами значений и ссылочные типы .
Итак, если вы имеете дело со типами значений, NullReferenceExceptions не может произойти. Хотя вам нужно поддерживать оповещение при работе со ссылочными типами!
Только ссылочные типы, как следует из названия, могут содержать ссылки или буквально буквально ничто (или «нуль»). Если типы значений всегда содержат значение.
Типы ссылок (эти должны быть проверены):
Типы значений (вы можете просто игнорировать эти):
managedQuery()
будет использовать запрос ContentResolver (). Разница в том, что с managedQuery()
активность будет содержать ссылку на ваш курсор и закрывать ее по мере необходимости (например, в onDestroy()
.) Если вы сами query()
, вам придется управлять курсором как чувствительным ресурсом , Если вы забудете, например, close()
его в onDestroy()
, вы пропустите основные ресурсы (logcat предупредит вас об этом.)
Чтобы запросить поставщика контента, вы можете использовать либо ContentResolver.query()
или Activity.managedQuery()
. Оба метода принимают один и тот же набор аргументов, и оба возвращают объект Cursor. Однако managedQuery()
заставляет деятельность управлять жизненным циклом Курсора. Управляемый курсор обрабатывает все тонкости, такие как разгрузка, когда активность приостанавливается, и запрашивает себя при перезапуске активности. Вы можете попросить Activity начать управление неуправляемым объектом Cursor для вас, вызвав Activity.startManagingCursor()
.
Обновление:
managedQuery
теперь устарело (начиная с Android 3.0).
managedQuery (..) теперь устарел (начиная с Android 3.0). Остерегайтесь ..
Ошибка Android: java.lang.IllegalStateException: пытается запросить уже закрытый курсор