我遇到了一个问题,我试图调用空对象引用,但是我完全按照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());
答案 0 :(得分:0)
您正在从singleSnapshot.getValue(UserAccountSettings.class)获取空值。
您需要在参考处检查可用数据,并在Firebase数据库中添加了listenerForSingleValueEvent。