使用getValue(Boolean.class)时Firebase数据库NullPointerException

时间:2017-10-12 16:06:47

标签: java android firebase firebase-realtime-database

我使用Firebase数据库,并使用一个布尔字段将消息对象写入其中。当我尝试用getValue(Boolean.class)读取该对象时,我得到一个例外。它只在获得这个布尔值时发生,我得到的字符串没有问题。

导致异常的方法:

@Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        message.setSenderId(dataSnapshot.child("senderId").getValue(String.class));
        message.setDestinationId(dataSnapshot.child("destinationId").getValue(String.class));
        message.setDatetime(dataSnapshot.child("datetime").getValue(Date.class));
        message.setText(dataSnapshot.child("text").getValue(String.class));
        message.setSent(dataSnapshot.child("isSent").getValue(Boolean.class)); // this line causes NullPointerException
}

我的消息模型类:

@IgnoreExtraProperties
public class Message {

    @Exclude
    private String id;
    @Exclude
    private ValueEventListener valueListener;
    @Exclude
    private Conversation destination;

    // User ID
    private String senderId;
    // Conversation ID
    private String destinationId;
    private Date datetime;
    private String text;
    private boolean isSent = false;

    public Message(String id, String sender, String destination, Date date, String text) {

        this.id = id;
        this.senderId = sender;
        this.destinationId = destination;
        this.datetime = date;
        this.text = text;
    }

    public Message() {

    }

    public Message(String id, Conversation destination) {

        this.id = id;
        this.destination = destination;
    }

// ...

public boolean isSent() {

        return isSent;
    }

    public void setSent(boolean sent) {

        isSent = sent;
    }

}

存储在数据库中的消息示例:

{
  "datetime" : {
    "date" : 12,
    "day" : 4,
    "hours" : 17,
    "minutes" : 32,
    "month" : 9,
    "seconds" : 25,
    "time" : 1507822345776,
    "timezoneOffset" : -120,
    "year" : 117
  },
  "destinationId" : "test_conversation",
  "isSent" : true,
  "senderId" : "test_sender",
  "text" : "hello world"
}

该代码有什么问题?我试图解决这个问题,但我仍然没有想出任何东西。

4 个答案:

答案 0 :(得分:3)

尝试将 isSent 变量的类型更改为布尔

如果setSent(boolean)返回null,在null调用方法{{1}}时会导致异常原因,这将有所帮助。

答案 1 :(得分:1)

我正在使用布尔值,从来就不是问题。但我曾经历过同样的问题,这是因为在数据库中它使用字段sent保存而不是isSent。 你可以从控制台屏幕截取数据库吗?

我的解决方案是将@PropertyName("isSent")放在getter和setter之前

@PropertyName("isSent")
public boolean isSent() {

    return isSent;
}

@PropertyName("isSent")
public void setSent(boolean sent) {

    isSent = sent;
}

我担心数据库中的字段是"sent" : true而不是"isSent" : true

答案 2 :(得分:0)

对我来说,看起来布尔(基元)和布尔(类)之间存在不匹配。你想解决这个问题并再试一次吗? 使用Boolean(类)替换Message Model类中的所有原始声明。 让我知道它是怎么回事。

答案 3 :(得分:0)

尝试替换

public void setSent(boolean sent) {

    isSent = sent;
}

public void setSent(boolean sent) {

    this.isSent = sent;
}