在空对象引用上调用虚拟方法'java.lang.String com.fivenine.shareit2.models.UserAccountSettings.getProfile_photo()'

时间:2019-03-19 16:25:38

标签: java nullpointerexception

我遇到了一个问题,我试图调用空对象引用,但是我完全按照Instagram Clone的视频进行操作,该视频可以毫无问题地完成此操作,但是我遇到了问题,我非常努力地找出来这个问题花了一个小时,但我仍然没有任何想法,我确实尝试了您提出的所有解决方案,但对我来说不起作用。

问题出在这里:

  

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String com.fivenine.shareit2.models.UserAccountSettings.getProfile_photo()'           在com.fivenine.shareit2.ViewPostFragment.setupWidgets(ViewPostFragment.java:134)           在com.fivenine.shareit2.ViewPostFragment.onCreateView(ViewPostFragment.java:98)           在android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)           在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)           在android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)           在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)           在android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)           在android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)           在android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)           在android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)           在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)           在android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:733)           在android.os.Handler.handleCallback(Handler.java:754)           在android.os.Handler.dispatchMessage(Handler.java:95)           在android.os.Looper.loop(Looper.java:165)           在android.app.ActivityThread.main(ActivityThread.java:6375)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:912)           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)

以下是UserAccountSettings的代码:

公共类UserAccountSettings {

private String description;
private String display_name;
private long followers;
private long following;
private long posts;
private String profile_photo;
private String username;
private String website;
private String user_id;

public UserAccountSettings(String description, String display_name, long followers, long following, long posts, String profile_photo, String username, String website, String user_id) {
    this.description = description;
    this.display_name = display_name;
    this.followers = followers;
    this.following = following;
    this.posts = posts;
    this.profile_photo = profile_photo;
    this.username = username;
    this.website = website;
    this.user_id = user_id;
}

public UserAccountSettings() {

}

public String getUser_id() {
    return user_id;
}

public void setUser_id(String user_id) {
    this.user_id = user_id;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getDisplay_name() {
    return display_name;
}

public void setDisplay_name(String display_name) {
    this.display_name = display_name;
}

public long getFollowers() {
    return followers;
}

public void setFollowers(long followers) {
    this.followers = followers;
}

public long getFollowing() {
    return following;
}

public void setFollowing(long following) {
    this.following = following;
}

public long getPosts() {
    return posts;
}

public void setPosts(long posts) {
    this.posts = posts;
}

public String getProfile_photo() {
    return profile_photo;
}

public void setProfile_photo(String profile_photo) {
    this.profile_photo = profile_photo;
}

public String getUsername() {
    return username;
}

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

public String getWebsite() {
    return website;
}

public void setWebsite(String website) {
    this.website = website;
}


@Override
public String toString() {
    return "UserAccountSettings{" +
            "description='" + description + '\'' +
            ", display_name='" + display_name + '\'' +
            ", followers=" + followers +
            ", following=" + following +
            ", posts=" + posts +
            ", profile_photo='" + profile_photo + '\'' +
            ", username='" + username + '\'' +
            ", website='" + website + '\'' +
            ", user_id='" + user_id + '\'' +
            '}';
}

}

然后指出ViewPostFragment中的问题,下面是代码:

公共类ViewPostFragment扩展了片段{

private static final String TAG = "ViewPostFragment";

public ViewPostFragment(){
    super();
    setArguments(new Bundle());
}

//firebase
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference myRef;
private FirebaseMethods mFirebaseMethods;


//widgets
private SquareImageView mPostImage;
private BottomNavigationViewEx bottomNavigationView;
private TextView mBackLabel, mCaption, mUsername, mTimestamp;
private ImageView mBackArrow, mEllipses, mHeartRed, mHeartWhite, mProfileImage;


//vars
private Photo mPhoto;
private int mActivityNumber = 0;
private String photoUsername = "";
private String profilePhotoUrl = "";
private UserAccountSettings mUserAccountSettings;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_view_post, container, false);
    mPostImage = (SquareImageView) view.findViewById(R.id.post_image);
    bottomNavigationView = (BottomNavigationViewEx) view.findViewById(R.id.bottomNavViewBar);
    mBackArrow = (ImageView) view.findViewById(R.id.backArrow);
    mBackLabel = (TextView) view.findViewById(R.id.tvBackLabel);
    mCaption = (TextView) view.findViewById(R.id.image_caption);
    mUsername = (TextView) view.findViewById(R.id.username);
    mTimestamp = (TextView) view.findViewById(R.id.image_time_posted);
    mEllipses = (ImageView) view.findViewById(R.id.ivEllipses);
    mHeartRed = (ImageView) view.findViewById(R.id.image_heart_red);
    mHeartWhite = (ImageView) view.findViewById(R.id.image_heart);
    mProfileImage = (ImageView) view.findViewById(R.id.profile_photo);

    try{
        mPhoto = getPhotoFromBundle();
        UniversalImageLoader.setImage(mPhoto.getImage_path(), mPostImage, null, "");
        mActivityNumber = getActivityNumFromBundle();

    }catch (NullPointerException e){
        Log.e(TAG, "onCreateView: NullPointerException: " + e.getMessage() );
    }

    setupFirebaseAuth();
    setupBottomNavigationView();
    getPhotoDetails();
    setupWidgets();

    return view;
}

private void getPhotoDetails(){
    Log.d(TAG, "getPhotoDetails: retrieving photo details.");
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    Query query = reference
            .child(getString(R.string.dbname_user_account_settings))
            .orderByChild(getString(R.string.field_user_id))
            .equalTo(mPhoto.getUser_id());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for ( DataSnapshot singleSnapshot :  dataSnapshot.getChildren()){
                mUserAccountSettings = singleSnapshot.getValue(UserAccountSettings.class);
            }
            //setupWidgets();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d(TAG, "onCancelled: query cancelled.");
        }
    });
}

private void setupWidgets() {
    String timestampDiff = getTimestampDifference();
    if (!timestampDiff.equals("0")) {
        mTimestamp.setText(timestampDiff + " DAYS AGO");
    } else {
        mTimestamp.setText("TODAY");
    }

        UniversalImageLoader.setImage(mUserAccountSettings.getProfile_photo(), mProfileImage, null, "");
        mUsername.setText(mUserAccountSettings.getUsername());


}
/**
 * Returns a string representing the number of days ago the post was made
 * @return
 */
private String getTimestampDifference(){
    Log.d(TAG, "getTimestampDifference: getting timestamp difference.");

    String difference = "";
    Calendar c = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.CANADA);
    sdf.setTimeZone(TimeZone.getTimeZone("Canada/Pacific"));//google 'android list of timezones'
    Date today = c.getTime();
    sdf.format(today);
    Date timestamp;
    final String photoTimestamp = mPhoto.getDate_created();
    try{
        timestamp = sdf.parse(photoTimestamp);
        difference = String.valueOf(Math.round(((today.getTime() - timestamp.getTime()) / 1000 / 60 / 60 / 24 )));
    }catch (ParseException e){
        Log.e(TAG, "getTimestampDifference: ParseException: " + e.getMessage() );
        difference = "0";
    }
    return difference;
}

/**
 * retrieve the activity number from the incoming bundle from profileActivity interface
 * @return
 */
private int getActivityNumFromBundle(){
    Log.d(TAG, "getActivityNumFromBundle: arguments: " + getArguments());

    Bundle bundle = this.getArguments();
    if(bundle != null) {
        return bundle.getInt(getString(R.string.activity_number));
    }else{
        return 0;
    }
}

/**
 * retrieve the photo from the incoming bundle from profileActivity interface
 * @return
 */
private Photo getPhotoFromBundle(){
    Log.d(TAG, "getPhotoFromBundle: arguments: " + getArguments());

    Bundle bundle = this.getArguments();
    if(bundle != null) {
        return bundle.getParcelable(getString(R.string.photo));
    }else{
        return null;
    }
}

/**
 * BottomNavigationView setup
 */
private void setupBottomNavigationView(){
    Log.d(TAG, "setupBottomNavigationView: setting up BottomNavigationView");
    BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationView);
    BottomNavigationViewHelper.enableNavigation(getActivity(),getActivity() ,bottomNavigationView);
    Menu menu = bottomNavigationView.getMenu();
    MenuItem menuItem = menu.getItem(mActivityNumber);
    menuItem.setChecked(true);
}

   /*
------------------------------------ Firebase ---------------------------------------------
 */

/**
 * Setup the firebase auth object
 */
private void setupFirebaseAuth(){
    Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");

    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    myRef = mFirebaseDatabase.getReference();

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();


            if (user != null) {
                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
            // ...
        }
    };


}


@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

}

似乎这行引起了问题:

UniversalImageLoader.setImage(mUserAccountSettings.getProfile_photo(), mProfileImage, null, "");
            mUsername.setText(mUserAccountSettings.getUsername()); 

1 个答案:

答案 0 :(得分:0)

您正在从singleSnapshot.getValue(UserAccountSettings.class)获取空值。

您需要在参考处检查可用数据,并在Firebase数据库中添加了listenerForSingleValueEvent。