我使用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"
}
该代码有什么问题?我试图解决这个问题,但我仍然没有想出任何东西。
答案 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;
}