引用Firebase时抛出Java java.lang.ClassCastException

时间:2013-11-30 22:10:47

标签: java firebase classcastexception

我是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.jav‌​a:47)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:8‌​86)
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行

1 个答案:

答案 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