Обязательно ли всегда проверять на null?

178
01 февраля 2019, 21:20

Новичок в 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();
                }
            }
        }
Answer 1

Такая проверка не нужна точно.

Если метод вернул null, значит, что-то пошло не так. Если попытаться использовать полученный результат, то получим ошибку NullPointerOperation и стек вызовов. Как правило, получение указателя будет где-то рядом и можно будет найти и исправить код. Еще раз, ошибка не в возникновении NPE, а в том, что метод вернул null и нужно смотреть на сам метод

То, что вы предлагаете

MyObject obj = getObject();
if (obj != null) {
  .......
}

позволит мастерски скрыть ошибку, которую потом придется искать очень долго. Ведь она может проявиться совсем в неожиданном месте.

Если уже делать проверку то такую

MyObject obj = getObject();
if (obj != null) {
  .......
} else {
  showMessage("getObject() вернул null. Сообщите разработчику");
}

Или оставить вообще без проверки. Но с фиксацией где-то конечного исключения

Answer 2

К примеру вы можете вызвать getActivity() в другом потоке и оно вернёт null.

Книги не являются эталоном, они пишутся такими же людьми. Мне недостаточно информации, чтобы объяснить, почему автор посчитал, что не стоит добавлять данную проверку, но причин может быть множество, одна из них допущение, что данной ситуации никогда не произойдёт, а данные строки только усложнят понимание читателя, из-за не имеющих отношения к проблеме избыточного кода.

READ ALSO
Некорректно отображаются символы

Некорректно отображаются символы

Всем привет! Ситуация такая: я сделал jar-файл для selenium (скрипт для автозаполнения), который считывает данные изcsv и записывает эти данные в поля...

193
Android Studio - Ошибка при сборке

Android Studio - Ошибка при сборке

При сборке приложения в Android Studio появляется ошибка такого содержания:

233
Не работает nextLine()

Не работает nextLine()

При выборе 8 кейса не сохраняет результат в переменнуюИ как-то странно считывает (пропускает одну строку, и только тогда текст с клавиатуры)...

180
Java Files.walkTree

Java Files.walkTree

Только начал изучать Java и дойдя о раздела Path и Files столкнулся со следующей проблемой

170