Как исправить «AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main, kotlin.Исключение KotlinNullPointerException»? ошибка при попытке удалить сохраненные данные Sqlite db

#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 предупреждение в этой строке.