Новичок в java и android, учусь по книжке, там дают код без проверок на null, но andorid studio постоянно подсвечивает, что метод может вернуть null. Видел ответы, что проверять на null все таки стоит, но странно тогда, почему книга этому не учит, поэтому решил спросить ещё раз.
Вот фрагмент кода, здесь я уже подставил проверки так, чтобы студия не ругалась, но мне кажется это каким то странным, к примеру, не особо понимаю в каких условиях getActivity может быть null.
if (requestCode == REQUEST_CONTACT && data != null) {
Uri contactUri = data.getData();
String[] queryFields = new String[]{ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.LOOKUP_KEY};
if (getActivity() != null && contactUri != null) { //В оригинале этой проверки нет.
Cursor cursor = getActivity().getContentResolver()
.query(contactUri, queryFields, null, null, null);
if (cursor != null) { //В оригинале этой проверки нет.
try {
if (cursor.getCount() == 0) {
return;
}
cursor.moveToFirst();
int suspectName = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
int lookUpColumn = cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY);
String suspect = cursor.getString(suspectName);
String lookUpKey = cursor.getString(lookUpColumn);
mCrime.setSuspect(suspect);
mCrime.setLookUpKey(lookUpKey);
mChooseSuspectButton.setText(suspect);
mCallTheSuspectButton.setEnabled(true);
} finally {
cursor.close();
}
}
}
Такая проверка не нужна точно.
Если метод вернул null
, значит, что-то пошло не так. Если попытаться использовать полученный результат, то получим ошибку NullPointerOperation и стек вызовов. Как правило, получение указателя будет где-то рядом и можно будет найти и исправить код. Еще раз, ошибка не в возникновении NPE, а в том, что метод вернул null
и нужно смотреть на сам метод
То, что вы предлагаете
MyObject obj = getObject();
if (obj != null) {
.......
}
позволит мастерски скрыть ошибку, которую потом придется искать очень долго. Ведь она может проявиться совсем в неожиданном месте.
Если уже делать проверку то такую
MyObject obj = getObject();
if (obj != null) {
.......
} else {
showMessage("getObject() вернул null. Сообщите разработчику");
}
Или оставить вообще без проверки. Но с фиксацией где-то конечного исключения
К примеру вы можете вызвать getActivity()
в другом потоке и оно вернёт null
.
Книги не являются эталоном, они пишутся такими же людьми. Мне недостаточно информации, чтобы объяснить, почему автор посчитал, что не стоит добавлять данную проверку, но причин может быть множество, одна из них допущение, что данной ситуации никогда не произойдёт, а данные строки только усложнят понимание читателя, из-за не имеющих отношения к проблеме избыточного кода.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем привет! Ситуация такая: я сделал jar-файл для selenium (скрипт для автозаполнения), который считывает данные изcsv и записывает эти данные в поля...
При сборке приложения в Android Studio появляется ошибка такого содержания:
При выборе 8 кейса не сохраняет результат в переменнуюИ как-то странно считывает (пропускает одну строку, и только тогда текст с клавиатуры)...
Только начал изучать Java и дойдя о раздела Path и Files столкнулся со следующей проблемой