我是Java的新手,我一直无法解决我收到的异常。
首先,这是例外:
Exception in thread "FirebaseEventTarget" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
at CallServer$1.onDataChange(CallServer.java:30)
at com.firebase.client.core.ValueListenerContainer$1.run(ValueListenerContainer.java:47)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
这是代码。
public class CallServer {
public void displayNameWeight(int adress){
// x = card name, displays card name and weight
String url = "https://dominion-randomizer.firebaseio.com/Set/Base/"
+ adress ;
Firebase referenceCard = new Firebase(url);
referenceCard.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snap) {
Object value = snap.getValue();
/*Line 30*/ String name = (String) ((Map) value).get("name");
Long weight = (Long)((Map)value).get("weight");
System.out.println(name + "'s weight is:" + weight);
}
@Override
public void onCancelled(FirebaseError arg) {
System.err.println("oops");
}
});
}
public void writeWeight(int adress, int weight) {
String url = "https://dominion-randomizer.firebaseio.com/Set/Base/"
+ adress;
Firebase referenceCard = new Firebase(url);
System.out.println("Card ID:" + adress);
referenceCard.child("weight").setValue(weight);
}
所以我的问题是,当我使用displayNameWeight方法时,它正常运行,但是当我尝试将writeWeight与displayNameWeight一起使用时,我得到了一个java.lang.ClassCastException。我知道我不能将不同类型的对象组合在一起,但是我不明白为什么第一种方法正确运行而第二种方法没有。我唯一能想到的是,当我引用Firebase网址时,对象类型会以某种方式被更改。
我为我的问题道歉并不一定是连贯的,我对编程很新。 编辑:显示第30行
答案 0 :(得分:2)
不要在将它拉出地图时施放重量,而是尝试将其作为对象拉出来,然后检查它是什么类型。
或者,您可以执行以下操作,而不是将整个快照转换为地图:
Long weight = snap.child("weight").getValue(Long.class);
这可能更容易阅读。一般来说,我会说看一下DataSnapshot的文档,有几种实用方法可以让它更容易使用,而不是没有指定类型的键和值的Map:https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html