当前位置: 首页 > 知识库问答 >
问题:

为什么下面的函数返回null ArrayList?

逑何平
2023-03-14

我甚至使用过List,但仍然得到空指针,但如果我使用livedata,它会在for a循环中成功更新。它不会返回NULL。为什么只有list或Arraylist返回null

  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
}

共有1个答案

桓修能
2023-03-14

日志记录中抛出的NPE是因为banklist在更改侦听器中被修改。

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

    )

当没有进行任何更改时,或者在侦听器内部,可迭代的DataSnapshot.Children为空-BankList保持为空。因此,当您调用list[index]时,它将返回null,因为没有找到任何东西,并且它将抛出一个NPE,因为您对null调用.bank_account

return banklist //this is null

我很确定方法末尾的banklist不是空的。因为前面的代码抛出了一个异常,所以从未到达该部分。

 类似资料:
  • 问题内容: 我是一名编程初学者,对函数的返回值有疑问。 我正在学习Java。 我已经附上了我的书中具有经典选择排序功能的代码。 现在显然来自本书的代码可以正常工作。但是,主要功能中的以下三行是我的问题的基础: int [] a = new int [] {1,9,2,8,3,7,4,6​​,5}; 排序(a); if(ascending(a))System.out.println(“ Works”

  • 下面的代码抛出,但我不明白为什么,该对象不是null。

  • 问题内容: 我正在尝试使用一个字段来获取手动输入,然后使用该数据。 我发现的所有资料都声称我应该使用该函数,但是我还没有找到一个简单的可运行的迷你示例,因此无法正常工作。 我希望有人可以给我打电话,告诉我我做错了什么。这是一个迷你文件: 这给了我一个我可以输入的字段,但是一旦输入数据我就什么也不能做。 我怀疑我的代码不起作用,因为最初它是空的。但是,一旦输入了输入数据,我该如何访问呢? 问题答案:

  • 问题内容: 我有一个箭头函数,看起来像这样(简化): 但是当我调用它时,我得到: 为什么? 例: ( 注意: 对于上述带有箭头功能的 特定 问题,这是一个干净,规范的重复目标。) 问题答案: 当您使用箭头函数的函数主体版本(带有)时,没有暗示。您必须指定它。当您使用 简洁 主体(no )时,主体表达式的结果将由函数隐式返回。 因此,您可以使用显式的方式编写该代码: 或简洁的主体: 例子: 略 切线

  • 我使用的是我的代码中有两个可观察的对象 观察值不是来自请求,而是来自 我需要根据这个逻辑将序列组合/转换成一个单一的可观察值: 如果序列,或,-需要返回新的可观察的否则需要返回 我试图使用来实现: 但问题是我的

  • 问题内容: 如果我在构造函数中返回一些值或对象,那么var会得到什么? 在两种情况下都会得到什么n? 其实这是一个测验问题,答案是什么? 自定义对象构造函数返回什么? a)新实例化的对象 b)未定义-构造函数不返回值 c)不论return语句是 d)等于return语句是什么;新实例化的对象(如果没有return语句) 问题答案: 我发现了这个很棒的链接: 上面提到的第二点魔术是构造函数返回特定的