Почему следующая функция возвращает нулевой ArrayList? - PullRequest
0 голосов
/ 29 октября 2019

Я даже использовал List, но все равно я получаю нулевой указатель, но если я использую livingata, он успешно обновляется внутри цикла for. Это не возвращает ноль. Почему это только список или Arraylist, который возвращает ноль

  fun List(): ArrayList<Bank> {
    val banklist = ArrayList<Bank>()
    val reference = FirebaseDatabase.getInstance().reference
        .child("groups")
        .child(group.group_id)
        .child("financials")
        .child("cash")
        .child("bank")
    reference.addValueEventListener(object : ValueEventListener {

        override fun onCancelled(p0: DatabaseError) {

        }

        override fun onDataChange(dataSnapshot: DataSnapshot) {

            for (singleSnapshot in dataSnapshot.children) {
                Log.d(
                    "Data", "banks found: "
                            + singleSnapshot.value
                )
                val bank = singleSnapshot.getValue(Bank::class.java)
                banklist.add(bank!!)

               bankListLivedata.value = banklist //updates perfectly

            }


            Log.d(
                "Data", "banksList1 ${banklist[0].bank_account} "//This is printing in the log

            )

        }
    }
    )
    Log.d(
        "Data", "banksList2 ${banklist[0].bank_account} " //This is throwing null pointer exception

    )

    return banklist //this is null

  //if I return banklistLivedata it works perfectly and doesn't throw null
}

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

NPE, брошенный в вашу регистрацию, происходит из-за того, что banklist изменяется в слушателе изменений.

Log.d(
        "Data", "banksList2 ${banklist[0].bank_account} " //This is throwing null pointer exception

    )

Когда никаких изменений не было сделано или внутри слушателя итератор dataSnapshot.children пуст - banklist остается пустым. Поэтому, когда вы вызываете list [index] , он вернет null, так как ничего не было найдено, и бросит NPE, потому что вы звоните .bank_account на null.


return banklist //this is null

Я почти уверен, что banklist в конце вашего метода равно , а не null. Эта часть просто никогда не достигается, потому что код прежде выдает исключение.

0 голосов
/ 29 октября 2019

Решение состоит в том, чтобы убедиться, что вы проверяете, является ли список пустым, прежде чем пытаться войти, или, что еще лучше, использовать один из утилит Kotlin (например, firstOrNull())чтобы получить первый элемент списка:

Log.d("Data", "banksList2 ${banklist.firstOrNull()?.bank_account} ")

Я бы также предложил сделать то же самое для регистрации внутри слушателя:

Log.d("Data", "banksList1 ${banklist.firstOrNull()?.bank_account} ")
...