Всякий раз, когда я делаю один вызов как ненулевое, студия Android удаляет предупреждение из других тех же переменных.

Всякий раз, когда я пытаюсь создать несколько логических переменных внутри функции, у которой есть e: Entry? в своем конструкторе студия Android уведомляет меня, что разрешены только безопасные или ненулевые утвержденные вызовы. Итак, всякий раз, когда я делаю один вызов как ненулевое, студия Android удаляет это предупреждение из других переменных, и код работает. Почему так?

                        val isHighResult = e!!.y >= 3.5
                        val isMediumResult = e.y > 1.5 && e.y < 3.5
                        val isLowResult = e.y <= 1.5

person space.trueper    schedule 18.06.2021    source источник
comment
Я предполагаю, что переменная e не изменилась, так как вы использовали нулевое утверждение, поэтому, если она сработала при первом вызове, она должна работать для вызовов после нее, если вы переместите одну строку в верхнюю часть нулевого утверждения, она выдаст вам предупреждение   -  person abdullah yousry    schedule 18.06.2021


Ответы (1)


Параметры функции постоянны. Ваша первая строка кода гарантирует, что e либо не равно нулю, либо что дальнейшие строки кода не будут достигнуты, потому что это вызовет исключение KotlinNullPointerException, если e имеет значение null. Таким образом, логически e не может иметь значение NULL, если достигается вторая строка кода, и компилятор может интеллектуально преобразовать его в запись, не допускающую значения NULL.

Это не один из тех редких случаев, когда можно использовать !!. Нет причин, по которым код внутри этой функции должен ожидать, что e будет ненулевым, если вы объявили его как параметр функции, допускающий значение NULL. Объявляя его допускающим значение NULL, ваша функция объявляет (программистам, которые ее используют), что можно безопасно передавать значение NULL в качестве параметра.

person Tenfour04    schedule 18.06.2021
comment
Я использую эти переменные внутри оператора if, который проверяет, можно ли обнулить. Код вроде завершен, поэтому я не могу продолжить?:. Ty за исчерпывающий ответ! - person space.trueper; 18.06.2021
comment
Внутри оператора if (e != null) e будет умным преобразованием, не допускающим значения NULL, поэтому вам не понадобится !!. Кроме того, если вы вернетесь из функции внутри оператора if (e != null), тогда e будет умным преобразованием без значения NULL после оператора if. - person Tenfour04; 18.06.2021
comment
он немного более завершен. Я использую их внутри if (e?.x == x.toFloat()), который, в свою очередь, находится внутри for (x in 0..9) - person space.trueper; 18.06.2021
comment
Ах я вижу. Тогда было бы безопасно использовать !! внутри этого оператора if. Это условие слишком сложно для компилятора, чтобы использовать его для интеллектуального преобразования. Однако это странное условие. Обычно, если e или x имеет значение NULL, генерируется исключение. Я не могу увидеть весь ваш код, но он все равно выглядит небезопасным. - person Tenfour04; 18.06.2021
comment
о, ты! Думал, ничего не выйдет :) - person space.trueper; 18.06.2021
comment
Ой, подождите, я неправильно прочитал. Похоже, x - это не то же самое, что e.x. Но если x является строкой, toFloat() аварийно завершает работу, если его нельзя преобразовать в Float. - person Tenfour04; 18.06.2021
comment
нет, x из цикла for, вы были правы :) - person space.trueper; 18.06.2021