Подтвердить что ты не робот

Правильный способ обработки Android Studio NullPointerException lint warning

Я новичок в программировании android/java и смущен, как правильно справиться с этим предупреждением.

Вызов метода '' может генерировать "Java.lang.NullPointerException"

enter image description here

Должен ли я использовать assert для удаления предупреждения? enter image description here

Или скорее исключение во время выполнения? enter image description here

Любая помощь будет оценена.

4b9b3361

Ответ 1

Я сомневаюсь, что на этот вопрос можно ответить окончательно, так как это вопрос мнения. Или, по крайней мере, я так считаю - тоже мнение. :)

Я понимаю, что вы хотите "0 предупреждений" (очень похвальная цель), но, вероятно, нет проблемы "один размер подходит всем". Это сказал...

То, что я считаю, вы не должны делать:

  • Используйте assert. Хотя вы можете добавить утверждение assert, Dalvik игнорирует их. Вы можете настроить эмулятор для их использования, если хотите, но не для реального устройства (см. Можно ли использовать assert на устройствах Android?). Так что, хотя это может убрать предупреждение, на практике оно бесполезно.
  • У метода бросить NullPointerException. В общем, это была бы плохая идея. В этом случае, поскольку вы, вероятно, переопределяете onOptionsItemSelected(), это даже невозможно.

Проверка на (variable != null) как правило, лучший подход. Что делать, если это, однако, представляет некоторые другие варианты.

  • Если это проблема, которую вы можете searchView, то есть вы можете продолжить приложение, даже если searchView там нет, просто сделайте это. Например, просто вернитесь из метода. Хорошая идея записать эту ситуацию, так что вы можете определить ее во время тестирования.
  • В противном случае, если продолжение невозможно, выведите исключение. Вы хотите потерпеть неудачу рано, так что проблема может быть легко обнаружена. Разумное исключение для этого случая будет IllegalStateException (см. Java эквивалент .NET System.InvalidOperationException). Это в основном указывает на то, что этот метод был выполнен в неподходящее время. Однако будьте осторожны, поскольку в качестве RuntimeException эти исключения не RuntimeException и, следовательно, могут привести к сбою приложения.

Ответ 2

Я начал использовать

@SuppressWarnings("ConstantConditions")

в простых методах, где я уверен, что id не является нулевым.

Ответ 3

Что @Herrbert74 предположил, что он работает нормально, но иногда лучше не добавлять @SuppressWarnings("ConstantConditions") к целому методу (если это не тривиально), лучшим подходом может быть использование //noinspection ConstantConditions на предупрежденной строке.

Это мои правила:

  • Используйте @SuppressWarnings("ConstantConditions"), когда метод прост.

  • Используйте //noinspection ConstantConditions, когда метод является сложным, и вам нужно удалить предупреждение только на определенной строке

Ответ 4

Да. Использование if (Object != null){} для проверки правильного пути. try {} catch (NullPointerException) {} является следующим решением, которое является предпочтительным в этом случае.

Если вы хотите прокатиться на нем, бросьте NullPointerException. В этом случае Линт будет игнорировать его. public void myFunc() throws NullPointerException{}.

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

Ответ 5

Я лично предпочитаю использовать try {} catch {} просто потому, что он более изящный. Тем не менее, он добавляет много большого количества к вашему коду, если вы представляете себе все возможное значение NULL в try catch (если они не находятся рядом друг с другом)

Ответ 6

Как отметил @matiash, решения для одноразового использования не существует.

Для меня хорошим компромиссом было отключить предупреждение NullPointerException для всех вызовов findViewById() и сохранить его для других вызовов методов. Таким образом, я беру на себя ответственность за проверку идентификаторов ресурсов, но все же получаю выгоду от получения предупреждений, если я совершаю другие ошибки.

Для этого я добавил контракт _ -> !null с быстрым меню Android Studio.

В моем корневом проекте действие создало следующий файл в android/support/v7/app/annotations.xml.

<root>
  <item name='android.support.v7.app.AppCompatActivity android.view.View findViewById(int)'>
    <annotation name='org.jetbrains.annotations.Contract'>
      <val val="&quot;_ -&gt; !null&quot;" />
    </annotation>
  </item>
</root>

Update: К сожалению, он не выдержал Android Studio перезагрузки:-( Внешние аннотации действительно полезны, поэтому я надеюсь, что смогу заставить Android Studio загрузить их после перезагрузки.

Ответ 7

Мне нравится ответ на ссылку .

Предупреждение не является ошибкой. И предупреждение, о котором вы говорите говорит, что "это может произвести", не говорите "он должен произвести". Таким образом, выбор ваша. Или добавьте нулевую проверку или нет.

Итак, если вы уверены, что findViewById в вашем коде никогда не будет причиной NPE, то не добавляйте нулевую проверку.