предупреждение об исключении getActivity? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть фрагмент, где я сделаю следующее:

getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                                }
                    });

Здесь я получаю за runOnUiThread предупреждение may produce NullPointerException.Код работает без проблем. Android Studio предлагает изменить код следующим образом:

Objects.requireNonNull(getActivity()).runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

это разумно?Есть ли другой / лучший способ?

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Это зависит от вашей цели:

1) Вы хотите, чтобы разработчик заметил, что он допустил ошибку, вызвав этот метод в состоянии, когда getActivity() выдает исключение NullPointerException

private void myMethod() {
    if(null == getActivity()) {
        throw new IllegalStateException(); // Or NullPointerException
    }
    // Do your stuff with getActivity()
}

2) Вы знаете, что getActivity() не выбросит NullPointerException в вашем случае:

private void myMethod() {
    assert getActivity() != null;
    // Do your stuff with getActivity()
}

3) Вы знаете, что getActivity() может быть нулевым, вы не хотите, чтобы приложение внезапно останавливалось:

private void myMethod() {
    if(null == getActivity()) {
        return;
    }
    // Do your stuff with getActivity()
}

Использование Objects.requireNonNull () также требует API-уровень 19 (4.4 (KITKAT))

Конечно, вы добрый разработчик, и вы заметите все в своем Javadoc :)

У вас также есть тонны информации прямо здесь

0 голосов
/ 15 октября 2018

(1) рекомендуется использовать фрагменты для проверки isAdded (фрагмент добавляется к активности хоста) перед вызовом getActivity().Это помогает избежать исключения нулевого указателя, когда фрагмент отсоединен от действия хоста.

if (isAdded() && null != getActivity()) {
   // your logic
}

(2) requireNonNull(T obj) Проверяет, что указанная ссылка на объект не является нулевой.Этот метод предназначен главным образом для проверки параметров в методах и конструкторах.

Броски NullPointerException - если значение obj равно null ( выполнение приложения может прекратиться в этот момент ).

Резюме : в соответствии с текущим контекстом requireNonNull(T obj) не подходит.Вы должны обращаться с указателем null изящно.

0 голосов
/ 15 октября 2018

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

if(getActivity() != null) {
      getActivity().runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
                                }
        });
}

Но также вы можете использовать метод #requireActivity (). Это работает как getActivity, но если действие является нулевым (если фрагмент отсоединен), он выдаст исключение IllegalStateException

https://developer.android.com/reference/android/support/v4/app/Fragment#requireActivity()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...