【问题标题】:.firebase.database.DatabaseReference com.google.firebase.database.FirebaseDatabase.getReference(java.lang.String)' on a null object reference.firebase.database.DatabaseReference com.google.firebase.database.FirebaseDatabase.getReference(java.lang.String)' 在空对象引用上
【发布时间】:2019-07-22 06:41:48
【问题描述】:

我得到一个空指针异常,而我正在尝试将数据添加到 firebase 中的实时数据库中

package com.example.ecommerce;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.*;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.HashMap;

public class register extends AppCompatActivity {

  EditText inputname, password, Phone;
  Button createaccount;
  ProgressDialog loadingbar;
  FirebaseDatabase database;
  DatabaseReference ref;
  User user;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    inputname = findViewById(R.id.username);
    password = findViewById(R.id.reg_password);
    Phone = findViewById(R.id.reg_phone_number);
    createaccount = findViewById(R.id.create_account);
    // loadingbar=new ProgressDialog(this);
    ref = database.getReference("User");
    user = new User();

  }

  public void getValues() {
    user.setName(inputname.getText().toString());
    user.setPhone(Phone.getText().toString());
    user.setPassword(password.getText().toString());
  }
  public void btn(View view) {
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        getValues();
        ref.child("user02").setValue(user);
        Toast.makeText(register.this, "Data Inserted", Toast.LENGTH_LONG).show();
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {

      }
    });
  }
}

用户类:

package com.example.ecommerce;

public class User {

    private String Name;
    private String Phone;
    private String Password;

    public User() {

    }

    public User(String name, String phone, String password) {
        Name = name;
        Phone = phone;
        Password = password;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    public String getPhone() {
        return Phone;
    }

    public void setPhone(String phone) {
        Phone = phone;
    }

    public String getPassword() {
        return Password;
    }

    public void setPassword(String password) {
        Password = password;
    }
}

日志:

2019-07-22 12:02:52.086 15273-15273/com.example.ecommerce E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.ecommerce, PID: 15273
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ecommerce/com.example.ecommerce.register}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.FirebaseDatabase.getReference(java.lang.String)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3121)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:81)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1935)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7116)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.FirebaseDatabase.getReference(java.lang.String)' on a null object reference
        at com.example.ecommerce.register.onCreate(register.java:44)
        at android.app.Activity.performCreate(Activity.java:7698)
        at android.app.Activity.performCreate(Activity.java:7687)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3096)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:81) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1935) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7116) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)

【问题讨论】:

标签: android database firebase path


【解决方案1】:

您需要在 oncreate 方法中创建一个数据库对象。由于您的数据库对象,您得到空指针异常。你的 oncreate 方法的代码应该是这样的。

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_register);

  inputname = findViewById(R.id.username);
  password = findViewById(R.id.reg_password);
  Phone = findViewById(R.id.reg_phone_number);
  createaccount = findViewById(R.id.create_account);
  // loadingbar=new ProgressDialog(this);
   database = FirebaseDatabase.getInstance();
   ref = database.getReference("User");
  user = new User();

}

【讨论】:

  • 非常感谢 :) 但我遇到了另一个问题,点击创建帐户按钮什么都不做,没有数据保存在 Firebase 中,也没有得到“插入数据”的吐司
  • 您的 Firebase 数据库中有“用户”引用吗?
  • 尝试在onCancelled()方法中放入toast
  • 是的,我有@Sanjay,在 onCancelled() 方法中也不起作用
  • @simran 你遇到什么崩溃了吗?
【解决方案2】:

database 为 null 它不引用堆中的任何内容,您需要通过以下操作对其进行初始化:

FirebaseDatabase database = FirebaseDatabase.getInstance();

那么你可以这样做:

DatabaseReference ref = database.getReference("User");

【讨论】:

  • 非常感谢 :) 但我遇到了另一个问题,点击创建帐户按钮什么也不做,没有数据保存在 Firebase 中,也没有得到“插入数据”的吐司
【解决方案3】:

好像忘记初始化了

FirebaseDatabase database = FirebaseDatabase.getInstance();

在初始化 ref (DatabaseReference) 之前初始化你的数据库。

为了写给你的根“用户”,

    User user =new  User(
        Name = etName.text.toString(),
        Phone = etPhone.text.toString(),
        password = etPassword.text.toString()
    )
    database.child(userId).setValue(user)

【讨论】:

  • 非常感谢 :) 但我遇到了另一个问题,点击创建帐户按钮什么都不做,没有数据保存在 Firebase 中,也没有得到“插入数据”的吐司
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多