Новичок в 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.
Книги не являются эталоном, они пишутся такими же людьми. Мне недостаточно информации, чтобы объяснить, почему автор посчитал, что не стоит добавлять данную проверку, но причин может быть множество, одна из них допущение, что данной ситуации никогда не произойдёт, а данные строки только усложнят понимание читателя, из-за не имеющих отношения к проблеме избыточного кода.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости