从Listener中调用.runTransaction()时出现NullPointerException

时间:2018-01-21 19:05:13

标签: java android firebase firebase-realtime-database

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

基本上,我在.runTransaction()内调用.addListenerForSingelValueEvent()方法:

    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

1 个答案:

答案 0 :(得分:2)

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

请参阅documentation。特别是,说明:

  

注意:因为多次调用doTransaction(),所以必须这样做   能够处理空数据。即使您的现有数据存在   远程数据库,它可能不会在事务时本地缓存   函数运行,导致初始值为null。

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