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

Android Studio中通过Intent和Bundle传递坐标遇空指针崩溃求助

解决Activity间传递经纬度时Bundle为空的崩溃问题

嘿,我看你在两个Activity之间传经纬度时遇到了Bundle为空的空指针崩溃,这种情况我也碰到过几次,下面给你几个排查方向和替代方案:

一、先排查最基础的配置和代码疏漏

首先先排除几个最容易忽略的点:

  • 确认FinalRestaurant在Manifest里注册了:虽然你的错误是空指针,但如果Activity没注册,跳转时也会崩溃,先检查AndroidManifest.xml里有没有这个Activity的注册项:
    <activity android:name=".FinalRestaurant" />
    
  • 检查currentMarkerLocation是否为空:你在第一个Activity里用Toast打印了经纬度,但如果currentMarkerLocation本身是null的话,Toast会先崩溃,不过还是建议加个非空判断,避免后续逻辑出问题:
    if (currentMarkerLocation != null) {
        // 这里写传参和跳转的代码
    } else {
        Toast.makeText(FindLocation.this, "当前位置未获取到", Toast.LENGTH_LONG).show();
    }
    
  • 确认你调用了startActivity(intent):很多时候写了Intent和Bundle,但忘了启动Activity,这也会导致后续逻辑异常,一定要确保在配置完Intent后调用了启动方法!

二、跳过Bundle,直接用Intent传参

既然用Bundle的方式出问题,不如试试直接用Intent的putExtra()方法,这种方式更简洁,也减少了一层封装可能带来的问题:

第一个Activity修改后的代码:

Intent intent = new Intent(FindLocation.this, FinalRestaurant.class);
if (currentMarkerLocation != null) {
    // 直接把经纬度放到Intent里
    intent.putExtra("LocationLat", currentMarkerLocation.latitude);
    intent.putExtra("LocationLng", currentMarkerLocation.longitude);
    Toast.makeText(FindLocation.this, currentMarkerLocation.latitude + ", " + currentMarkerLocation.longitude, Toast.LENGTH_LONG).show();
    startActivity(intent); // 关键:启动Activity
} else {
    Toast.makeText(FindLocation.this, "无法获取当前位置", Toast.LENGTH_LONG).show();
}

第二个Activity修改后的代码:

// 直接从Intent中获取,不用先拿Bundle
// 第二个参数是默认值,建议选一个不太可能出现的数值,比如-999.0,避免和真实位置混淆
double lat = getIntent().getDoubleExtra("LocationLat", -999.0);
double lng = getIntent().getDoubleExtra("LocationLng", -999.0);

// 先判断是否拿到了有效数据
if (lat != -999.0 && lng != -999.0) {
    Toast.makeText(FinalRestaurant.this, lat + ", " + lng, Toast.LENGTH_LONG).show();
} else {
    Toast.makeText(FinalRestaurant.this, "未接收到位置数据", Toast.LENGTH_LONG).show();
}

三、排查Intent是否被意外修改

如果上面的方法还是不行,可能是你的Intent在传递前被其他代码修改了,比如有没有在startActivity之前调用了intent.setData()或者其他修改Intent的方法?另外如果是从Fragment中启动Activity,要确保用的是正确的上下文(比如getActivity())。

四、用ViewModel做共享数据(应急+推荐方案)

如果Intent传参的方式怎么都不行,可以试试用Jetpack的ViewModel来共享数据,这种方式不需要依赖Intent传递,适合这种简单的跨页面数据共享:

步骤1:创建共享ViewModel

import androidx.lifecycle.ViewModel;

public class LocationShareViewModel extends ViewModel {
    private double currentLat;
    private double currentLng;

    public void saveLocation(double lat, double lng) {
        this.currentLat = lat;
        this.currentLng = lng;
    }

    public double getCurrentLat() {
        return currentLat;
    }

    public double getCurrentLng() {
        return currentLng;
    }
}

步骤2:第一个Activity中存储数据

// 获取ViewModel实例
LocationShareViewModel viewModel = new ViewModelProvider(this).get(LocationShareViewModel.class);
if (currentMarkerLocation != null) {
    // 存储经纬度
    viewModel.saveLocation(currentMarkerLocation.latitude, currentMarkerLocation.longitude);
    // 启动第二个Activity
    Intent intent = new Intent(FindLocation.this, FinalRestaurant.class);
    startActivity(intent);
}

步骤3:第二个Activity中读取数据

LocationShareViewModel viewModel = new ViewModelProvider(this).get(LocationShareViewModel.class);
double lat = viewModel.getCurrentLat();
double lng = viewModel.getCurrentLng();
// 这里可以加个判断,比如如果是默认值0.0的话提示未获取到
Toast.makeText(FinalRestaurant.this, lat + ", " + lng, Toast.LENGTH_LONG).show();

最后再提个小建议:用默认值的时候别用0.0,因为0°纬度0°经度是真实存在的位置(大西洋几内亚湾附近),会干扰你判断是否真的拿到了数据,换成-999.0这种不太可能出现的数值会更靠谱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:42:41