You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android传递ArrayList<LatLng>触发空指针异常问题排查

解决LatLng列表跨Activity传递多元素时的空指针问题

核心问题定位

单个元素正常、多元素触发Class.isInterface()空指针,本质是Parcelable列表的传递/读取逻辑不匹配,或传递过程中存在元素空值、Intent复用的问题。

具体解决步骤

1. 规范传递侧(Util类)的Intent构建

确保每次创建新Intent,使用putParcelableArrayListExtra传递列表,同时校验元素非空:

public static void launchTargetActivity(Context context, ArrayList<LatLng> latLngList) {
    // 先校验列表及元素合法性
    if (latLngList == null || latLngList.contains(null)) {
        Log.e("Util", "LatLng列表为空或包含空元素");
        return;
    }
    // 每次创建新Intent,避免复用导致的数据异常
    Intent intent = new Intent(context, TargetActivity.class);
    intent.putParcelableArrayListExtra("EXTRA_LATLNG_LIST", latLngList);
    context.startActivity(intent);
}

2. 修正接收侧(TargetActivity)的读取逻辑

必须用getParcelableArrayListExtra直接读取,禁止用getParcelableArrayExtra手动转列表(多元素时易触发反序列化异常):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_target);

    ArrayList<LatLng> receivedLatLngs = getIntent().getParcelableArrayListExtra("EXTRA_LATLNG_LIST");
    // 判空后再操作
    if (receivedLatLngs != null && !receivedLatLngs.isEmpty()) {
        // 处理列表逻辑
        for (LatLng latLng : receivedLatLngs) {
            Log.d("TargetActivity", "接收坐标:" + latLng.latitude + "," + latLng.longitude);
        }
    } else {
        Log.w("TargetActivity", "未接收到有效LatLng列表");
    }
}

3. 排查自定义LatLng的Parcelable实现(非官方类时)

如果是你自己实现的LatLng而非Google Maps官方类,必须确保Parcelable序列化/反序列化逻辑完全正确,字段读写顺序一致:

public class LatLng implements Parcelable {
    private double lat;
    private double lng;

    public LatLng(double lat, double lng) {
        this.lat = lat;
        this.lng = lng;
    }

    // 反序列化构造函数
    protected LatLng(Parcel in) {
        lat = in.readDouble();
        lng = in.readDouble();
    }

    public static final Creator<LatLng> CREATOR = new Creator<LatLng>() {
        @Override
        public LatLng createFromParcel(Parcel in) {
            return new LatLng(in);
        }

        @Override
        public LatLng[] newArray(int size) {
            return new LatLng[size];
        }
    };

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeDouble(lat);
        dest.writeDouble(lng);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    // getter方法
    public double getLat() { return lat; }
    public double getLng() { return lng; }
}

(官方LatLng无需此操作,其Parcelable实现是可靠的)

4. 禁止复用全局Intent对象

如果Util类中使用了静态Intent变量复用,会导致多次调用时数据覆盖,必须每次创建新Intent对象(如步骤1所示)。

5. 日志定位空元素

如果问题仍存在,在传递前和接收后分别打印列表元素,确认是否有元素在传递过程中变为null:

  • 传递侧打印:
for (int i = 0; i < latLngList.size(); i++) {
    Log.d("Util", "待传递元素[" + i + "]:" + latLngList.get(i));
}
  • 接收侧打印:
if (receivedLatLngs != null) {
    for (int i = 0; i < receivedLatLngs.size(); i++) {
        Log.d("TargetActivity", "已接收元素[" + i + "]:" + receivedLatLngs.get(i));
    }
}

内容的提问来源于stack exchange,提问作者zxcisnoias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:27:08