#java #android #unit-testing #kotlin #android-viewmodel
#Android #исключение #null #kotlin
Вопрос:
Я получаю следующую ошибку времени выполнения:
checkParameterIsNotNull, parameter oneClickTokens
at com.info.app.fragments.Fragment_Payment_Profile$fetchMerchantHashes$1.onPostExecute(Fragment_Payment_Profile.kt:0)
at com.info.app.fragments.Fragment_Payment_Profile$fetchMerchantHashes$1.onPostExecute(Fragment_Payment_Profile.kt:1543)
Вот мой код:
private fun fetchMerchantHashes(intent: Intent) {
// now make the api call.
val postParams = "merchant_key=$keyamp;user_credentials=$var1"
val baseActivityIntent = intent
object : AsyncTask<Void, Void, HashMap<String, String>>() {
override fun doInBackground(vararg params: Void): HashMap<String, String>? {
...
}
override fun onPostExecute(oneClickTokens: HashMap<String, String>) {
super.onPostExecute(oneClickTokens)
...
}
}.execute()
}
Кажется, что вызов функции кажется недопустимым. Однако я не знаю, как решить эту проблему. Есть ли что-нибудь специфичное для Kotlin, что я пропустил?
Комментарии:
1. Вопросов нет. Пожалуйста, сформулируйте его, чтобы получить помощь.
Ответ №1:
Исключение довольно ясно: вы передаете null
для параметра.
По умолчанию все переменные и параметры в Kotlin ненулевые. Если вы хотите передать null
параметр методу, который вы должны добавить ?
к его типу, например:
fun fetchMerchantHashes(intent: Intent?)
Для получения дополнительной информации: null-безопасность.
Комментарии:
1. Я столкнулся с той же проблемой, и мне пришлось прочитать документацию Kotlin. Я вроде бы знал, что не так в моем коде, но для дальнейшего уточнения того, что я понял из документации Kotlin, я в конечном итоге перехожу на эту страницу, я обнаружил, что ваш ответ точно соответствует тому, что я думал. Ваш ответ ясен и лаконичен.
Ответ №2:
В моем случае эта ошибка предупреждала о вероятной передаче null в качестве параметра. Три способа исправления.
- Измените тип параметра в соответствующем месте. Если он получен из Java, добавьте
@NonNull
аннотацию к определению переменной. - Добавить
!!
к аргументу метода. - Добавить
?
к параметру в классе Kotlin. Я думаю, инструмент преобразования Kotlin мог бы сделать это по умолчанию, если в классе Java не использовались аннотации (например@Nullable
,@NonNull
).
Комментарии:
1. ошибки не являются предупреждениями, а предупреждения не являются ошибками. Добавление !! может вызвать исключение NullPointerException просто потому, что вы утверждаете во время выполнения, что оно ненулевое, когда оно на самом деле равно нулю.
2. @ezaspi, согласен с вами. Я добавлю
?
случай. В прошлом я устанавливал!!
, чтобы увидеть сбой во время выполнения, где мог произойти NPE.3. Мы только что завершили большой рефакторинг Android для Kotlin и эти надоедливые!! были хуже, чем возможные значения null, которые существовали ранее. Например, вызов метода abc(String somevalue) в Android преобразуется в Kotlin (с помощью конвертера) в abc(somevalue: String!!). Перед преобразованием abc обрабатывал нули, но после сразу же выдает NPE. Можно возразить, что у нас должен был быть @Nullable, но это был большой проект, и поэтому он не перехватил их все. И для сбоя приложения требуется только один из них.
4. Кстати, если бы это был просто наш код, это было бы не так плохо. Но многие переопределения Android не имеют аннотаций @Nullable . Итак, после завершения автоматического преобразования код может иметь следующее:
override fun onItemSelected(parentView: AdapterView<*>, selectedItemView: View, position: Int, id: Long)
но это должно быть представление с нулевым значением? поскольку это часто приводит к сбою5. @ezaspi, я полностью согласен с вами и также много раз сталкивался с этими проблемами. Это недостаток автоконвертера. Извините, я написал этот ответ год назад, когда начал изучать Kotlin.
Ответ №3:
Простой ответ будет работать наверняка… Когда вы извлекаете данные с сервера с помощью Rest Client (вызовы веб-служб) (GET Или POST), и если в ответе json может быть значение параметра null, и вы извлекаете параметр и добавляете его в textview, вы получаете эту ошибку..
Решение: просто добавить? отметьте переменную, как показано ниже..
Пример:
var batchNo: String? = "" (Correct Approach)
var batchNo= "" (Will Get Error)
Здесь я пытаюсь извлечь пакетно, используя вызов службы.
Ответ №4:
Я обнаружил аналогичное исключение после преобразования действия из Java в Kotlin с помощью инструмента преобразования Android Studio. Итак, это то, что я получил override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent)
Это правильно override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
Разница в intent: Intent?
Комментарии:
1. Да, это часто случается в старых классах Java, которые не используют
@Nullable
аннотации. Инструмент преобразования Kotlin не знает, как распознать этот параметр и предположить, что он не равен нулю (это ошибка). В Swift, если вы конвертируете из Objective-C, он предположит, что это может быть nil .
Ответ №5:
Для каждого из адаптеров привязки измените тип аргумента элемента на nullable и оберните тело с помощью
элемент?.пусть{…}
источник в документации Google