Возможно ли иметь NPE, если переменная инициализирована с использованием lateinit или синтетического расширения? - PullRequest
0 голосов
/ 11 июля 2019

Возможно ли иметь NPE, если переменная инициализируется lateinit?

1 / lateinit var pbar: ProgressBar

2 / pbar = findViewById (R.id.pbar_login)

3 / сделать вызов API, pbar.visibility = View.VISIBLE

4 / нажмите и уничтожьте действие (при условии, что все виды также будут уничтожены)

5 /

override fun onPostExecute() {
    if (pbar != null) { // warning: pbar != null is always true
        pbar.visibility = View.GONE // NPE??
    }
}

Вопросы:

1) Можно ли получить NPE, если я не проверю - если (pbar! = Null)?

2) Тот же вопрос, если переменные генерируются через синтетическое расширение, будет ли какой-нибудь NPE?


Я прошел этот вопрос, в данном случае мой следующий вопрос:

Существуют ли какие-либо передовые практики, позволяющие избегать NPE для представлений, связанных с переменными в деятельности, фрагментах или обзоре переработчика?

1 Ответ

1 голос
/ 11 июля 2019

Можно ли получить NPE, если я не проверю - если (pbar! = Null)?

Нет. Это свойство не может быть null.

Однако, вы все равно можете потерпеть крах. Не пытайтесь изменить уничтоженное действие, включая обновление его представлений. Или:

  • Используйте что-то вроде LiveData, чтобы сообщить действию о событии, чтобы оно могло реагировать на событие, если оно присутствует, но событие может быть проигнорировано, если действие уничтожено; или

  • Проверьте isDestroyed на действии, чтобы увидеть, было ли оно уничтожено, прежде чем пытаться обновить его представления (также рассмотрите isFinishing, так как в любом случае вам может не понадобиться обновление представлений)

Из этих двух я настоятельно рекомендую первый подход, как часть замены AsyncTask.

Тот же вопрос, если переменные генерируются через синтетическое расширение, будет ли какой-нибудь NPE?

Нет, это не может быть null, но вы все равно можете потерпеть крах (см. Выше).

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