#android #sqlite #kotlin #nullpointerexception
#Android #sqlite #kotlin #исключение nullpointerexception
Вопрос:
Я пытаюсь разработать приложение Notes, в котором я могу сохранять список заметок. Эти заметки будут сохранены в базе данных SQLite. Я установил кнопку для удаления созданной заметки. Когда я нажимаю на это окно во время выполнения (ошибка полного времени отсутствует), оно выдает мне указанную ошибку. Пожалуйста, помогите в решении этой проблемы.
Я попытался разработать это приложение, прочитав и скопировав код из
https://github.com/hussien89aa/KotlinUdemy/tree/master/Android/NoteApp/StartUp
inner class MyNotesAdapter : BaseAdapter {
var listNotesAdapter = ArrayList<note>()
var context: Context? = null
constructor(listNotesAdapter: ArrayList<note>) : super() {
this.listNotesAdapter = listNotesAdapter
this.context = context
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var myView = layoutInflater.inflate(R.layout.ticket, null)
var myNote = listNotesAdapter[position]
myView.tvTitle.text = myNote.nodeName
myView.tvDes.text = myNote.nodeDes
myView.delete.setOnClickListener(View.OnClickListener {
var dbManager = DbManager(this.context!!) //This is the line where I am getting error.
val selectionArgs = arrayOf(myNote.nodeID.toString())
dbManager.Delete("ID=?", selectionArgs)
LoadQuery("%")
})
Комментарии:
1. @EpicPandaForce не могли бы вы, пожалуйста, повторно открыть вопрос, потому что ответы из связанного вопроса об исключении NullPointerException в Java не имеют большого отношения к Kotlin и его исключению KotlinNullPointerException, которое возникает, когда
!!
оператор встречаетnull
значение. Также было бы неплохо объяснить, почемуcontext
здесь значение null.
Ответ №1:
Вы получаете KotlinNullPointerException
здесь из-за неудачного утверждения null в выражении context!!
в этой строке: !!
оператор гарантирует, что выражение слева не равно null, или выдает KNPE
иное.
Здесь context
переменная равна нулю на момент обращения к ней в OnClickListener
. Почему это значение равно null? Я полагаю, потому что в этом примере кода ему никогда не присваивалось значение, отличное от null. В частности, следующая часть кода выглядит подозрительно:
inner class MyNotesAdapter : BaseAdapter {
...
var context: Context? = null
constructor(listNotesAdapter: ArrayList<note>) : super() {
...
this.context = context
}
Здесь вы присваиваете значение context
context
переменной, но откуда берется это значение? Ближайшим идентификатором с таким именем является та же context
переменная, которая изначально равна null, поэтому этой переменной null
присваивается еще раз.
Фактически, IDE даже выдает Variable 'context' is assigned to itself
предупреждение в этой строке.