【问题标题】:Avoid Method invocation getLatitude may produce java.Lang.NullPointerException避免方法调用 getLatitude 可能产生 java.Lang.NullPointerException
【发布时间】:2019-05-15 22:32:26
【问题描述】:

我有一种方法可以在地图上显示设备的当前位置。我使用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() );
    }
}

【问题讨论】:

    标签: java android fusedlocationproviderclient


    【解决方案1】:

    IDE 在显示有关您的代码的信息时可能会很奇怪或被误解,但我向您保证它适用于 getLongitude() 和任何其他实例方法或实例成员的调用,因为位置可以为空。

    公共任务 getLastLocation ()
    返回当前可用的最近的最佳位置。

    如果一个位置不可用,这应该很少发生,null 将被退回。在尊重 位置权限将被返回。

    此方法提供了一种获取位置的简化方法。它是 特别适合不需要 准确的位置,并且不想维护额外的逻辑 位置更新。

    https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient.html#getLastLocation()

    所以即使任务成功,任务的结果也可以为空。这意味着您需要在使用它之前检查位置是否为空。

    【讨论】:

      【解决方案2】:

      正如Red 所指出的,如果基础对象为空,则在currentLocation 引用上调用任何其他方法将抛出NullPointerException,这可能是getLastLocation() 的结果。 IDE 只警告您对 getLatitude() 的调用的原因是因为它是对 currentLocation 的第一次调用取消引用它。如果该调用引发异常,则甚至不会进行其他方法调用。如果它不抛出异常,那么其他的也不会。因此,IDE 不需要就它们向您发出警告,因为此时为 null 的对象最终无关紧要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多