无法从firebase检索数据以在要修改的字段中显示用户,android java中的java.lang.NullPointerException
当我想从FirebaseDatabase检索数据以向用户显示数据时,允许他们修改输入 我得到如下java.lang.NullPointerException错误:无法从firebase检索数据以在要修改的字段中显示用户,android java中的java.lang.NullPointerException,java,android,firebase,nullpointerexception,Java,Android,Firebase,Nullpointerexception,当我想从FirebaseDatabase检索数据以向用户显示数据时,允许他们修改输入 我得到如下java.lang.NullPointerException错误: public class ParkingSpaceData { String parkingAddress; String latlng; LatLng myMarkerPosition; String entranceRef; String ownershipRef; String videoRef; U
public class ParkingSpaceData {
String parkingAddress;
String latlng;
LatLng myMarkerPosition;
String entranceRef;
String ownershipRef;
String videoRef;
Uri ivParkingSpaceEntranceUri, ivCertificateOfOwnershipUri , vvVideoOfEntranceToParkingSpaceUri;
public ParkingSpaceData() {}
public String getEntranceRef() {return entranceRef;}
public void setEntranceRef(String entranceRef) {this.entranceRef = entranceRef;}
public String getLatlng() {return latlng;}
public void setLatlng(String latlng) {this.latlng = latlng;}
public LatLng getMyMarkerPosition() {return myMarkerPosition;}
public void setMyMarkerPosition(LatLng myMarkerPosition) {this.myMarkerPosition = myMarkerPosition;}
.
.
.//getters and setters
.
public Uri getIvCertificateOfOwnershipUri() {return ivCertificateOfOwnershipUri;}
public void setIvCertificateOfOwnershipUri(Uri ivCertificateOfOwnershipUri){this.ivCertificateOfOwnershipUri = ivCertificateOfOwnershipUri;}
.
.
.
真奇怪。即使我检查了FirebaseDatabase,输入也已经存在于每个用户的唯一ID下
请帮我解决这个问题,并告诉我原因。
非常感谢你的帮助
FATAL EXCEPTION: main
Process: com.comli.loyalfine.myfirstgooglemapapplication, PID:16262 java.lang.NullPointerException
at com.comli.loyalfine.myfirstgooglemapapplication.ParkingSpaceRegisterActivity$12.onDataChange(ParkingSpaceRegisterActivity.java:495)
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:56)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5335)
at java.lang.reflect.Method.invokeNative(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
以下是我的代码
public void ReadAndDisplayData() {
mDatabaseRef= FirebaseDatabase.getInstance().getReference();
mDatabaseRef.child("Parking Space Data").child("Not Verified").child(userId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ParkingSpaceData post = null;
post = dataSnapshot.getValue(ParkingSpaceData.class);
assert post != null;
System.out.print("etParkingSpaceAddress is "+post.getParkingAddress().toString());
System.out.print("etLatLgn is "+post.getLatlng().toString());
System.out.print("entranceuri is "+post.getIvParkingSpaceEntranceUri().toString());
StorageReference fileRef = storageRef.child(userId).child("image").child(post.getEntranceRef());
System.out.print("file uri is " +fileRef.getDownloadUrl().toString());
ivParkingSpaceEntranceUri = post.getIvParkingSpaceEntranceUri();
ivCertificateOfOwnershipUri = post.getIvCertificateOfOwnershipUri();
vvVideoOfEntranceToParkingSpaceUri = post.getVvVideoOfEntranceToParkingSpaceUri();
//Toast.makeText(ParkingSpaceRegisterActivity.this,"entranceuri is "+post.getIvParkingSpaceEntranceUri().toString(), Toast.LENGTH_LONG).show();
// Toast.makeText(ParkingSpaceRegisterActivity.this,"file uri is " +fileRef.getDownloadUrl().toString(),Toast.LENGTH_LONG).show();
//Picasso.with(ParkingSpaceRegisterActivity.this).load(ivParkingSpaceEntranceUri).fit().centerCrop().into(ivParkingSpaceEntrance);
assert fileRef != null;
fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Picasso.with(ParkingSpaceRegisterActivity.this).load(uri).fit().centerCrop().into(ivParkingSpaceEntrance);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
fileRef = storageRef.child(userId).child("image").child(post.getOwnershipRef());
fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
Picasso.with(ParkingSpaceRegisterActivity.this).load(uri).fit().centerCrop().into(ivCertificateOfOwnership);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
fileRef = storageRef.child(userId).child("video").child(post.getVideoRef());
fileRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
vvVideoOfEntranceToParkingSpace.setBackgroundResource(0);
vvVideoOfEntranceToParkingSpace.setVideoURI(uri);
vvVideoOfEntranceToParkingSpace.start();
vvVideoOfEntranceToParkingSpace.pause();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
etParkingSpaceAddress.setText(post.getParkingAddress(), TextView.BufferType.EDITABLE);
etLatLgn.setText(post.getLatlng(), TextView.BufferType.EDITABLE);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Toast.makeText(ParkingSpaceRegisterActivity.this, "loadPost:onCancelled" + databaseError.toException().getMessage(), Toast.LENGTH_LONG).show();
// ...
}
});
}
对于ParkingSpaceData.class,其等级如下:
public class ParkingSpaceData {
String parkingAddress;
String latlng;
LatLng myMarkerPosition;
String entranceRef;
String ownershipRef;
String videoRef;
Uri ivParkingSpaceEntranceUri, ivCertificateOfOwnershipUri , vvVideoOfEntranceToParkingSpaceUri;
public ParkingSpaceData() {}
public String getEntranceRef() {return entranceRef;}
public void setEntranceRef(String entranceRef) {this.entranceRef = entranceRef;}
public String getLatlng() {return latlng;}
public void setLatlng(String latlng) {this.latlng = latlng;}
public LatLng getMyMarkerPosition() {return myMarkerPosition;}
public void setMyMarkerPosition(LatLng myMarkerPosition) {this.myMarkerPosition = myMarkerPosition;}
.
.
.//getters and setters
.
public Uri getIvCertificateOfOwnershipUri() {return ivCertificateOfOwnershipUri;}
public void setIvCertificateOfOwnershipUri(Uri ivCertificateOfOwnershipUri){this.ivCertificateOfOwnershipUri = ivCertificateOfOwnershipUri;}
.
.
.
在on DataChanged下的readAndDisplayData()方法中
查格:这是什么
ParkingSpaceData post = null;
post=dataSnapshot.getValue(ParkingSpaceData.class);
为此:
dataSnapshot.getValue(new ParkingSpaceData.class);
看看你是否仍然会犯同样的错误。我总是怀疑在本地用null初始化这样的对象。这可能不是一个完美的解决方案,但很多时候它确实解决了此类空错误。此外,大多数firebase示例鼓励采用更晚的方式检索数据
如果这对你有什么改变,请告诉我
编辑-在您的场景中,它的工作方式如下:
ParkingSpaceData post = dataSnapshot.getValue(ParkingSpaceData.class);
这应该可以编译。我的全部目的是避免用null初始化它。请试试这个
System.out.print("etParkingSpaceAddress is "+post.getParkingAddress().toString());
System.out.print("etLatLgn is "+post.getLatlng().toString());
System.out.print("entranceuri is "+post.getIvParkingSpaceEntranceUri().toString());
从此代码中删除所有.toString()
调用。如果项目不为空,则它们是多余的,如果为空,则会导致NPE
System.out.print("etParkingSpaceAddress is "+post.getParkingAddress());
System.out.print("etLatLgn is "+post.getLatlng());
System.out.print("entranceuri is "+post.getIvParkingSpaceEntranceUri());
该错误是在第
行ParkingSpaceRegisterActivity.java:495
上引起的。我将在调试器中运行代码,并查看引发异常的位置。该行中的一个值是null
。这是一个System.Out.Println,用于显示null位置,其中post.getParkingAddress()为null。但是,firebasedatabase中已经有一个值。您能否更新您的问题,在停车位数据/Not Verified/$userId
中包含JSON结构的最小示例(作为文本,无屏幕截图)?如果您可以将代码减少到仍然会导致崩溃的最小代码,这也会很好。我怀疑你的ParkingSpaceData
类是否能处理它们,但如果没有看到这个类,很难确定。另外:请将代码和JSON的数量减少到再现问题所需的最小值。这将使帮助您变得更容易。建议的代码甚至没有编译,更不用说有一个合理的解释了。我忘了指出一个事实,即我遗漏了用于实际获取数据的实际post变量。对不起,我犯了那个错误。希望建议的编辑可以编译。那么为什么不删除没有编译的部分呢?新建议的代码将如何改变任何事情?仍然没有合理的解释。我同意你的观点,初始化为null是徒劳的,但这并不会导致这个问题。谢谢你的输入,但它不起作用。原因尚不清楚。即使使用toString(),它仍然会得到Null异常。问题位于post.get…()为null的任何位置。但这是为什么?@LoyalFine我说要删除它,而不是继续使用它。那些System.out.print语句通常会被删除,并且只有在我的调试过程中出现,以确定问题所在。如果它们包含.toString()
调用,它们就会成为问题。因此,请删除.toString()
。根本的问题是一个或多个getter正在重新运行null,而您没有检查它。为什么post.getvalue()可以正常工作,而其他post.getParkingAddress()或其他键的值会遇到NPE问题?