首页 > 解决方案 > 尝试在空对象引用上调用虚拟方法“void com.basicprofileapp.dataholder.setUsername(java.lang.String)”

问题描述

我正在创建一个基本应用程序,它接受输入并将其存储在具有自动递增功能的 firebase 数据库中,但每次给出空指针异常时它都会崩溃。

我认为我的数据持有者 java 文件中有一些问题,但我无法修复它。

我已经尝试更改 dataholder 文件中的参数。我已经检查了我的 android 清单文件中的 firebase 服务。

这是我的数据持有者 java 文件

public class dataholder {

    String username,password1;

    public dataholder(String username, String password1) {
        this.username = username;
        this.password1 = password1;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword1() {
        return password1;
    }

    public void setPassword1(String password1) {
        this.password1 = password1;
    }
}

和 MainActivity

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

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

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;

public class MainActivity extends AppCompatActivity {

    EditText name;
    EditText password;
    Button login;


    DatabaseReference reff;
    dataholder obj;

    long maxid = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        name = (EditText) findViewById(R.id.etusername);
        password = (EditText) findViewById(R.id.etpassword);
        login = (Button) findViewById(R.id.Login);

        reff = FirebaseDatabase.getInstance().getReference().child("dataholder");
        reff.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists())
                    maxid = (dataSnapshot.getChildrenCount());
            }

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

            }
        });

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                obj.setUsername(name.getText().toString().trim());
                obj.setPassword1(password.getText().toString().trim());

                reff.child(String.valueOf(maxid + 1)).setValue("obj");
                Toast.makeText(getApplicationContext(), "Data inserted ", Toast.LENGTH_SHORT).show();

            }
        });
    }

}

标签: javaandroidfirebasenullpointerexception

解决方案


您的字段从未设置,因此当您在调用的“登录”dataholder obj中访问它时它为空。OnClickListenerButton

您需要先分配obj一个实际值,然后才能访问 getter/setter,例如obj = new dataholder(...).


推荐阅读