Android:应用程序在进入无效位置时崩溃

时间:2012-09-11 02:55:22

标签: android location

在我的应用程序中,我必须查找给定位置是否属于指定区域。我以新德里康诺特广场为中心。我得到的地址距离中心点200英里。但是,如果我输入任何无效的位置,例如“abcdfdfkc”,应用程序崩溃了,因为它试图找到这个位置的坐标,我想避免这种情况。

下面我发布了代码:

public static  boolean isServicedLocation(Context _ctx, String strAddress){
    boolean isServicedLocation = false;

    Address sourceAddress = getAddress(_ctx, "Connaught Place, New Delhi, India");
    Location sourceLocation = new Location("");
    sourceLocation.setLatitude(sourceAddress.getLatitude());
    sourceLocation.setLongitude(sourceAddress.getLongitude());      

    Address targetAddress = getAddress(_ctx, strAddress);
    Location targetLocation = new Location("");

    if (targetLocation != null) {
        targetLocation.setLatitude(targetAddress.getLatitude());
        targetLocation.setLongitude(targetAddress.getLongitude());
        float distance = Math.abs(sourceLocation.distanceTo(targetLocation));
        double distanceMiles = distance/1609.34;
        isServicedLocation = distanceMiles <= 200;

        //Toast.makeText(_ctx, "Distance "+distanceMiles, Toast.LENGTH_LONG).show();
    }       

    return isServicedLocation;
}

getAddress方法:

public static Address getAddress(Context _ctx, String addressStr) {
    Geocoder geoCoder = new Geocoder(_ctx, Locale.getDefault());
    try {
        List<Address> addresses = geoCoder.getFromLocationName(addressStr,
                1);

        if (addresses.size() != 0) {
            return addresses.get(0);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}

1 个答案:

答案 0 :(得分:1)

这是因为当您没有从GeoCoder找到地址时(即addresses.size() == 0),您将返回null

然后,无论如何,你取消引用该值,这就是你的应用程序崩溃的原因。

Address targetAddress = getAddress(_ctx, strAddress);
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:
if (targetLocation != null) {
    targetLocation.setLatitude(targetAddress.getLatitude());
                               ^^^^^^^^^^^^^

您可能还应检查targetAddress null以避免这种情况(除了(可能)之外,或者代替(不太可能)检查targetLocation)。

所以我正在考虑改变:

if (targetLocation != null) {

成:

if ((targetLocation != null) && (targetAddress != null)) {

这样,无效地址会自动成为未提供服务的位置。