java - 避免方法调用 getLatitude 可能产生 java.Lang.NullPointerException
问题描述
我有一种方法可以在地图上显示设备的当前位置。我正在使用FusedLocationProviderClient
,因为它似乎是最准确的。
我currentLocation.getLatitude()
收到警告:
方法调用可能产生 java.Lang.NullPointerException
我怎样才能避免这种风险?为什么它只与 currentLocation.getLatitude() 而不是相关currentLocation.getLongitude()
?
private void getDeviceLocation(){
Log.d(TAG, "getDeviceLocation: getting the devices current location");
FusedLocationProviderClient mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
try{
if(mLocationPermissionsGranted){
final Task location = mFusedLocationProviderClient.getLastLocation();
location.addOnCompleteListener(task -> {
if(task.isSuccessful()){
Log.d(TAG, "onComplete: found location!");
Location currentLocation = (Location) task.getResult();
LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude());
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, DEFAULT_ZOOM));
}else{
Log.d(TAG, "onComplete: current location is null");
}
});
}
}catch (SecurityException e){
Log.e(TAG, "getDeviceLocation: SecurityException: " + e.getMessage() );
}
}
解决方案
IDE 在显示有关您的代码的信息时可能会很奇怪或被误解,但我向您保证它适用于 getLongitude() 和任何其他实例方法或实例成员的调用,因为位置可以为空。
public Task getLastLocation ()
返回当前可用的最近的最佳位置。如果某个位置不可用(这种情况应该很少发生),则将返回 null。将返回尊重位置权限的最佳精度。
此方法提供了一种获取位置的简化方法。它特别适合不需要准确位置并且不想为位置更新维护额外逻辑的应用程序。
所以即使任务成功,任务的结果也可以为空。这意味着您需要在使用它之前检查位置是否为空。
推荐阅读
- java - 如何在反应堆通量排序之前获得订单
- jquery - 使用 EasyAdmin 3.3 过滤器的自动完成选项
- postman-pre-request-script - 如何从邮递员中另一个请求的预请求选项卡运行 GET 和 POST 请求?
- flutter - Flutter web - 构建后颜色不一致
- python - 映射使用 python 生成的图形中的最低点
- bash - 从字符串中排除某个字符之后的所有内容
- python - 创建数据框列表
- spring-boot - 在执行 postam org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value
- php - 使用 intelephense 时出现实际上不是 vscode 错误的错误
- kotlin - ktor 测试失败,“响应已发送”