Java Can';无法从ValueEventListener内部类读取值

Java Can';无法从ValueEventListener内部类读取值,java,android,firebase-realtime-database,inner-classes,Java,Android,Firebase Realtime Database,Inner Classes,我尝试从Firebase数据库中获取单个记录,并将其转换为Kategori类中的对象,该类由其id_kategor'属性确定 public class Kategori { private String nama_id; private String nama_en; private String id_kategori; private Integer jml_item = 0; private Integer jml_brand = 0; public Kateg

我尝试从Firebase数据库中获取单个记录,并将其转换为
Kategori
类中的对象,该类由其
id_kategor
'
属性确定

public class Kategori {

  private String nama_id;
  private String nama_en;
  private String id_kategori;
  private Integer jml_item = 0;
  private Integer jml_brand = 0;

  public Kategori(){}

  public Kategori(String id_kategori) {
    this.id_kategori = id_kategori;
    this.fetchData();
  }

  private void fetchData(){
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("kategori");

    myRef.child( this.id_kategori ).addListenerForSingleValueEvent(new ValueEventListener (){

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if( dataSnapshot.exists() ){
                String nama_en = dataSnapshot.child("nama_en").getValue(String.class);
                String nama_id = dataSnapshot.child("nama_id").getValue(String.class);

                Kategori.this.nama_en = nama_en;
                Kategori.this.nama_id = nama_id;

                Log.d(">>>>>> CHECK 1 >>>>>",Kategori.this.nama_en);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    //Log.d(">>>>>> CHECK 2 >>>>>",this.nama_en);
  }
}
我希望所有属性都能从Firebase获得正确的值

带有标记的日志检查1显示正确的结果,这意味着成功地从Firebase获取其值。 但是带有标记的日志检查2给了我运行时错误
*“java.lang.NullPointerException:println需要一条消息”*
,这意味着
**nama_en'**
属性有
*null*
值,也意味着属性无法从
Firebase ValueEventListener获取它的值

到底是什么问题

这是我的数据样本


检查2可能在检查1之前运行,尤其是在初始化
nama_en
之前

这里的要点是,
addListenerForSingleValueEvent
将内部类添加为侦听器,但它不会立即执行其中的代码。相反,它直接继续执行检查2调试语句。
尤其是
name\u en
是初始化的
onDataChange
,因此当调用该方法时,无论什么数据发生更改时都会发生这种情况(我不熟悉Firebase API)


您可以通过同时激活两个调试语句来检查此行为,也可以使用
String.valueOf(Object o)
,这样您就不会遇到NPE,但仍然可以看到
null
值。

您可以再次检查firebase数据吗,我看到它是一个返回null的en字段,因此如果en是一个数字或另一种数据类型,添加“”引号,使firebase将其识别为字符串谢谢您的回复,但我认为我的firebase数据没有问题,因为
CHECK 1
日志提供了数据库的正确结果。此外,我的数据id使用字母数字,并以字母表开始。为了确保这一点,我在问题中添加了Firebase上数据样本的屏幕截图,Izruo解释说这是预期的行为。数据是从Firebase(以及大多数现代web)异步加载的,您的
onDataChange
方法只有在
check 2
被记录并且函数返回
fetchData
后很久才会被调用。解决方案是将需要数据的任何代码从Firebase移动到
onDataChange
(或从那里调用)。有关详细说明,请参见和。谢谢。是的,我想是这样,***
检查2
**可能在**
检查1
**之前运行。另外,当我使用attributes值时,可能它们仍然没有数据,因为该方法尚未执行。这是一个同步过程,我应该把代码放在哪里来捕获和使用结果数据