Android调用Address.getShortAddress()报NullPointerException怎么解决
问题根因
你收到的NullPointerException是因为DashBoardActivity中监听地址LiveData的回调里,返回的Address对象为空,你直接调用了它的getShortAddress()方法导致崩溃。
对应报错位置的代码片段:
viewmodel.getAddressLiveData().observe(this, new Observer<Address>() { @Override public void onChanged(Address address) { location.setText(address.getShortAddress()); } });
LiveData返回的address为空属于常见场景,比如地址获取失败、定位权限未授予、定位服务未开启等情况,ViewModel都可能给LiveData设置空值,没有非空判断直接调用方法就会抛出空指针。
解决方法
你可以根据业务需求选择以下任意一种修复方案:
- 方案1:添加基础非空判断,为空时展示默认提示
viewmodel.getAddressLiveData().observe(this, new Observer<Address>() { @Override public void onChanged(Address address) { if(address != null){ location.setText(address.getShortAddress()); }else{ // 为空时显示自定义默认文案,也可在此处触发重新获取地址的逻辑 location.setText("获取位置失败"); } } });
- 方案2:如果项目支持Java 8及以上版本,可用Optional简化判空逻辑
viewmodel.getAddressLiveData().observe(this, new Observer<Address>() { @Override public void onChanged(Address address) { Optional.ofNullable(address) .map(Address::getShortAddress) .ifPresentOrElse( location::setText, () -> location.setText("获取位置失败") ); } });
额外优化建议
你可以同步检查ViewModel中fetchAddress方法的实现逻辑:
- 地址获取前先校验定位权限,没有权限时优先给用户弹出权限申请提示,而非直接返回空地址
- 地址获取失败的场景可添加重试逻辑,或者抛出明确的错误提示告知用户失败原因
内容的提问来源于stack exchange,提问作者Helina Kadariya
相关产品推荐
相关产品推荐

