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

标签 java firebase classcastexception

我对 Java 相当陌生,在解决收到的异常时遇到了困难。

首先,这是一个异常(exception):

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 url 时,对象类型以某种方式发生了变化。

很抱歉我的问题不一定连贯,我对编程很陌生。 编辑:显示第 30 行

最佳答案

不要在将其从 map 中拉出时施放重量,而是尝试将其作为对象拉出,然后检查它是什么类型。

或者,您可以执行以下操作,而不是将整个快照转换为 map :

Long weight = snap.child("weight").getValue(Long.class);

这可能更容易阅读。一般来说,我会说看一下 DataSnapshot 的文档,有几种实用方法可以使其更容易使用,而不是没有指定键和值类型的 Map:https://www.firebase.com/docs/java-api/javadoc/com/firebase/client/DataSnapshot.html

关于引用 Firebase 时抛出 Java java.lang.ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20306235/

相关文章:

java - 使用 Docker 安装 rJava 包

javascript - 将 json 发送到网格

android - 更新 firebase 版本后出现错误 "Cannot resolve symbol R"

ios - Swift 中的 FirebaseDatabase 查询问题

java - JTable 未出现在窗口中

java - 为什么我的 mac 不显示 java 版本?

ios - 带有 Firebase Id token 的 Firestore REST API

android - 完成 Firebase 函数(Uri 和 String)Android Java 时出现 ClassCastException

java - Android:Button 类的 ClassCastException

java - ClassCastException - 从对话框 fragment 的适配器类获取 Activity 的 View 引用