首页 > 解决方案 > 尝试在空对象引用上调用虚拟方法“java.lang.String com.practice.projectbm.Model.User.getName()”

问题描述

在此处输入图像描述我正在尝试从具有名为 EmailUsers 的子项的 firebase 数据库中获取数据,该子项由名称、电子邮件、生物等组成。我想在我的 xml 视图中显示这些项目。但是我收到了标题中提到的错误。这是我的 ProfileFragment.java

public class ProfileFragment extends Fragment
{

    ImageView back_button_to_feed, share, settings;
    private CircleImageView profile_photo;
    private int SELECT_PICTURE = 1;
    private Uri imageUri;
    private TextView ques;
    private TextView followers;
    private TextView following;
    private Button editprof;
    private TextView username;
    private TextView bioo;
    private FirebaseUser fire;
    String profileId;

    public interface ProfileFragmentCallback
    {
        public void onSettingsClicks();
    }


    public static ProfileFragmentCallback profileFragmentCallback;
    public static ProfileFragment GetInstance(ProfileFragmentCallback callback)
    {
        profileFragmentCallback = callback;
        return new ProfileFragment();
    }

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;








    public ProfileFragment() {
        // Required empty public constructor
    }


    public static ProfileFragment newInstance(String param1, String param2) {
        ProfileFragment fragment = new ProfileFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);

        }
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {

        View view = inflater.inflate(R.layout.profile_fragment, container, false);
        //Mapping
        back_button_to_feed = view.findViewById(R.id.back_arrow);
        profile_photo = view.findViewById(R.id.profile_picture);
        share = view.findViewById(R.id.share_profile);
        settings = view.findViewById(R.id.settings_in_profile);
        username = view.findViewById(R.id.account_username);
        bioo = view.findViewById(R.id.bio);
        followers = view.findViewById(R.id.followers);
        following = view.findViewById(R.id.following);
        editprof = view.findViewById(R.id.edit_details);
        fire = FirebaseAuth.getInstance().getCurrentUser();
        profileId = fire.getUid();


        //Mapping Ends


        //If user clicks on back button we'll take him to feed
        back_button_to_feed.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                    getActivity().onBackPressed();
            }
        });
        //If user clicks on back button we'll take him to feed Ends

        //If user clicks on share
        share.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_SUBJECT, "Hey Check Out My Profile");
                intent.putExtra(Intent.EXTRA_TEXT, "https://youtube.com");
                startActivity(Intent.createChooser(intent, "Share via"));
            }
        });
        //If user clicks on share Ends

        //If user clicks on settings
        settings.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                profileFragmentCallback.onSettingsClicks();
            }
        });
        //If user clicks on settings Ends

        //for image selection
        profile_photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //LOGIC FOR PROFILE PICTURE
                openImageChooser();
            }
        });
        //for image selection Ends

        userInfo();
        getFollowersAndFollowingCount();
        // Inflate the layout for this fragment
        return view;
        // Inflate the layout for this fragment Ends


    }



    private void getFollowersAndFollowingCount()
    {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Follow").child(profileId);
        ref.child("Followers").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull  DataSnapshot snapshot)
            {
                followers.setText(" " + snapshot.getChildrenCount());
            }

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

            }
        });
        ref.child("Following").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull  DataSnapshot snapshot)
            {
                following.setText(" " + snapshot.getChildrenCount());
            }

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

            }
        });
    }

    private void userInfo()
    {
        FirebaseDatabase.getInstance().getReference().child("EmailUsers").child(profileId).addValueEventListener(new ValueEventListener()
        {
            @Override
            public void onDataChange(@NonNull  DataSnapshot snapshot)
            {
                User user = snapshot.getValue(User.class);

                username.setText(user.getName());
                bioo.setText(user.getBio());

            }

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

            }
        });
    }


    void openImageChooser() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
    }







}

这是我的用户模型类

public class User
{
private String name;
private String email;
private String bio;
private String Imageurl;
private String id;


public User()
{

}

public User(String name, String email, String bio, String imageurl, String id) {
    this.name = name;
    this.email = email;
    this.bio = bio;
    Imageurl = imageurl;
    this.id = id;
}

public String getName()
{
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getBio() {
    return bio;
}

public void setBio(String bio) {
    this.bio = bio;
}

public String getImageurl() {
    return Imageurl;
}

public void setImageurl(String imageurl) {
    Imageurl = imageurl;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

}

这是我的用户适配器

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder>
{

private Context mContext;
private List<User> mUsers;
private boolean isFragment;

private FirebaseUser firebaseUser;

public UserAdapter(Context mContext, List<User> mUsers, boolean isFragment)
{
    this.mContext = mContext;
    this.mUsers = mUsers;
    this.isFragment = isFragment;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.user_item, parent, false);
    return new UserAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull  UserAdapter.ViewHolder holder, int position)
{

    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    User user = mUsers.get(position);
    holder.followw.setVisibility(View.VISIBLE);
    holder.uname.setText(user.getName());
    Picasso.get().load(user.getImageurl()).placeholder(R.mipmap.ic_launcher).into(holder.imageProfile);

    isFollowed(user.getId(), holder.followw);

    if(user.getId().equals(firebaseUser.getUid()))
    {
        holder.followw.setVisibility(View.GONE);
    }


    holder.followw.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(holder.followw.getText().toString().equals("Follow"))
            {
                FirebaseDatabase.getInstance().getReference().child("Follow").child(firebaseUser.getUid()).child("Following").child(user.getId()).setValue(true);


                FirebaseDatabase.getInstance().getReference().child("Follow").child(user.getId()).child("Followers").child(firebaseUser.getUid()).setValue(true);
            }
            else
            {
                FirebaseDatabase.getInstance().getReference().child("Follow").child(firebaseUser.getUid()).child("Following").child(user.getId()).removeValue();


                FirebaseDatabase.getInstance().getReference().child("Follow").child(user.getId()).child("Followers").child(firebaseUser.getUid()).removeValue();
            }

        }
    });
}

private void isFollowed(String id, Button followw)
{
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Follow").child(firebaseUser.getUid()).child("Following");

    reference.addValueEventListener(new ValueEventListener()
    {
        @Override
        public void onDataChange(@NonNull  DataSnapshot snapshot)
        {
            if(snapshot.child(id).exists())
            {
                followw.setText("Following");
            }
            else
            {
                followw.setText("Follow");
            }

        }

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

        }
    });
}

@Override
public int getItemCount()
{
    return mUsers.size();
}

public class ViewHolder extends RecyclerView.ViewHolder
{
    public CircleImageView imageProfile;
    public TextView uname;
    public Button followw;
    public ViewHolder(@NonNull View itemView)
    {
        super(itemView);

        imageProfile = itemView.findViewById(R.id.image_profile);
        uname = itemView.findViewById(R.id.fullname);
        followw = itemView.findViewById(R.id.follow);

    }
}

}

标签: firebasefirebase-realtime-databasefirebase-authenticationandroid-adapter

解决方案


我认为为您的 onClick 方法设置 Override 是不正确的。您不是简单地为您创建的按钮调用现有方法吗?覆盖超类方法的实现时使用注释,但您不是指标准的点击事件吗?不知道这是否能解决你的问题。您是否测试过您在方法之间传递的变量的结果?由于调用用户对象时会出现空指针错误,因此我将首先查看更密切相关的主题,例如 useradapter。

在您的用户适配器类中

System.out.println(view) //Check to see if this is what you were expecting

return new UserAdapter.ViewHolder(view);


System.out.println(holder)  //Check to see if this is what you were expecting

User user = mUsers.get(position);
holder.followw.setVisibility(View.VISIBLE);
holder.uname.setText(user.getName());

然后跟踪代码中相关的实例,例如当您设置视图时,并进行更多检查。

    View view = inflater.inflate(R.layout.profile_fragment, container, false);
    //Mapping

    System.out.println(view) //another check

    back_button_to_feed = view.findViewById(R.id.back_arrow);
    profile_photo = view.findViewById(R.id.profile_picture);
    share = view.findViewById(R.id.share_profile);
    settings = view.findViewById(R.id.settings_in_profile);
    username = view.findViewById(R.id.account_username);
    bioo = view.findViewById(R.id.bio);
    followers = view.findViewById(R.id.followers);
    following = view.findViewById(R.id.following);
    editprof = view.findViewById(R.id.edit_details);
    fire = FirebaseAuth.getInstance().getCurrentUser();
    profileId = fire.getUid();

    

祝你好运!


推荐阅读