java - 来自 CameraUpdateFactory 的空对象引用导致的致命错误
问题描述
我的应用程序中不断出现此致命错误,这是由空对象引用引起的。
06-06 14:10:43.180 12002-12002/? D/BarreChat: 29.356811:-57.3686681:lat/lng:
(29.356811,-57.3686681):com.google.android.gms.maps.CameraUpdate@a16f2f9
06-06 14:10:43.181 12002-12002/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.christopher.barrechat, PID: 12002
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference
at com.example.christopher.barrechat.BarreChat$1.onComplete(BarreChat.java:276)
at com.google.android.gms.tasks.zzj.run(Unknown Source:23)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:180)
at android.app.ActivityThread.main(ActivityThread.java:6950)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:835)
06-06 14:10:43.182 2867-15345/? E/ActivityManager: App crashed! Process: com.example.christopher.barrechat
这是给出错误消息的代码。你可以看到我添加了一些调试语句来尝试找出发生了什么。这些语句都在我发布的错误消息的第一行中的串联字符串中。调试语句都给出了我所期望的。除了具有引用但没有其他信息的 CameraUpdate 对象之外的所有这些对象。不过,这对我来说真的很莫名其妙。CameraUpdateFactory.newLatLngZoom() 正在传递一个空对象,但参数正是它正在寻找的。如果 miniMap(谷歌地图对象)没有被初始化,我认为它甚至不会识别 CameraUpdateFactory。对此的任何帮助将不胜感激。
private void getDeviceLocation() {
/*
* Get the best and most recent location of the device, which may be null in rare
* cases when a location is not available.
*/
try {
if (mLocationPermissionGranted) {
Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {
@Override
public void onComplete(@NonNull Task<Location> task) {
if (task.isSuccessful()) {
mLastKnownLocation = task.getResult();
//DEBUG
//Both give correct double
String errormess = Double.toString(mLastKnownLocation.getLatitude());
String errormesstwo = Double.toString(mLastKnownLocation.getLongitude());
//Gives a proper LatLng Object
String errormessthree = String.valueOf(new LatLng(mLastKnownLocation.getLatitude(), mLastKnownLocation.getLongitude()));
//Gives a reference and nothing else... Not working...
CameraUpdate SHYAT = CameraUpdateFactory.newLatLngZoom(new LatLng(mLastKnownLocation.getLatitude(), mLastKnownLocation.getLongitude()), DEFAULT_ZOOM);
String errormessfour = String.valueOf(SHYAT);
Log.d(TAG, errormess + ':' + errormesstwo + ':' + errormessthree + ':' + errormessfour);
miniMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(mLastKnownLocation.getLatitude(),
mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
} else {
Log.d(TAG, "Current location is null. Using defaults.");
Log.e(TAG, "Exception: %s", task.getException());
miniMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
miniMap.getUiSettings().setMyLocationButtonEnabled(false);
}
}
});
}
} catch(SecurityException e) {
Log.e("Exception: %s", e.getMessage());
}
}
解决方案
固定,不知道为什么。
在通过教程编码时,我拿出了
onMapReady(GoogleMap map) {
miniMap = map;
}
并将其替换为
onMapReady(GoogleMap miniMap) {}
将其改回以onMapReady(GoogleMap map) {miniMap = map;}
修复它。不知道为什么。
推荐阅读
- reactjs - 如何在 VSCode 中为 React 功能组件道具显示基于 JSDoc 的道具工具提示?
- spring-boot - 在 Spring Boot 中使用 thymeleaf 显示消息
- css - CSS网格中的自动偏移/对齐?
- c - printf("%d", 5) 和 printf("5") 的区别
- rest - 使用 HTTP/JSON 将文件上传到 gRPC 转码
- callback - 破折号,循环回调输入
- paypal-sandbox - 当我想在 PayPal 中批准新的定期付款时,我得到的总金额为 0
- .net - 提交更改实体框架时的线程并发
- c++ - 如何在没有默认构造函数和堆使用的情况下初始化对象?
- android - 更改可重用 xml 布局中元素的 id