【发布时间】:2020-02-24 20:38:33
【问题描述】:
我什至使用过 List,但仍然得到空指针,但如果我使用 livedata,它会在 for 循环内成功更新。它不返回空值。为什么只有返回 null 的 list 或 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
}
【问题讨论】:
-
您能否添加更多信息,显示您如何调用此函数以及异常发生的位置以及您收到的异常消息。就目前而言,我无法重现您遇到的错误
-
val list = list() if (list.isNullOrEmpty()) { Log.d("CashActivity", "List Null") } else { Log.d("CashActivity", "List $ {list[0].bank_account}") } 日志打印为空
-
这是有道理的。
isNullOrEmpty()适用于 null 列表,如果列表为 null 或为空,则返回 true(就像名字所说的那样)。因此,正如当前答案所暗示的那样,您的列表确实为空,这是因为它从未在函数调用中返回。当我说“它为空”时,我的意思是在函数之外,即期望从此函数获取列表的接收器对象为空 -
@smac89 谢谢,所以没有解决办法?
-
解决方案很简单:在尝试记录其第一个元素 (
Log.d("Data", "banksList1 ${banklist[0].bank_account} ")) 之前检查您的banklist(函数内部)是否有任何数据(Log.d("Data", "banksList1 ${banklist[0].bank_account} "))
标签: arrays list kotlin arraylist