java - 从监听器中调用 .runTransaction() 时出现 NullPointerException

标签 java android firebase firebase-realtime-database

我收到一个错误,该错误在我的设备屏幕上显示为 NullPointerException(它没有出现在日志中)。

本质上,我是从 .addListenerForSingelValueEvent() 中调用 .runTransaction() 方法:

    mPollsref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot d : dataSnapshot.getChildren()){
                        mPollsref.child(d.getKey()).child(VOTE_COUNT).runTransaction(new Transaction.Handler() {
                            @Override
                            public Transaction.Result doTransaction(MutableData mutableData) {
                                mutableData.setValue((long) mutableData.getValue() + 1);
                                return Transaction.success(mutableData);
                            }

我收到以下错误。仅仅是因为我从监听器中调用 .runTransaction() 吗?我找不到实际上是什么 null 以及如何解决:

enter image description here

最佳答案

您的事务处理程序必须能够处理在 MutableData 中使用 null 值进行的调用,因此您需要检查这一点并做出相应的响应。

请引用documentation 。特别是,注释中写道:

Note: Because doTransaction() is called multiple times, it must be able to handle null data. Even if there is existing data in your remote database, it may not be locally cached when the transaction function is run, resulting in null for the initial value.

更具体地说,在您的情况下,您尝试将 mutableData.getValue() 返回的 null 转换为 long。 Java 编译器在内部将其重写为在对象上调用 longValue(),首先强制转换为 Long,这就是导致您看到的错误消息的原因。

关于java - 从监听器中调用 .runTransaction() 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48370595/

相关文章:

java - 应用程序服务器中的线程

java - 无法在fragment中调用android注解方法?

java - Android Parcelable 无法实例化类型

ios - 禁用 Firebase Analytics for iOS 调试版本

java - 在 JDialog 上定位和调整 JScrollBar 的大小

java - 如何在按后退按钮时清除 jface 向导中的字段

java - CreateView 方法上的自定义对话框在 firebase firestore onCompletelistener 获取数据到列表之前返回

android - 当设备收到 FCM 高优先级消息时,设备会保持唤醒状态多长时间?

android - 如何在 Android 模拟器 4.0 中启用网络摄像头?

android - 如何将消息从后台服务发布到 UI fragment ?