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

Google PlacePicker地址解析数组越界致应用崩溃问题求助

解决PlacePicker地址处理时的数组越界崩溃问题

看到你遇到的错误:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=-1, data=Intent { (has extras) }} to activity: java.lang.ArrayIndexOutOfBoundsException: length=1; index=-1
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=1; index=-1

这个崩溃的根源很明确:当用户选择的地址字符串比较短(比如没有逗号分隔),你用split("\\,")拆分后得到的address数组长度只有1。这时候你去访问address[address.length-2],也就是address[1-2] = address[-1],这显然是非法的数组索引,直接触发了数组越界异常,导致你的if判断逻辑根本没机会执行,应用直接崩溃。

接下来给你具体的修复方案和优化后的代码:

核心修复思路

在尝试访问数组的倒数第二个元素之前,必须先检查数组的长度是否足够。如果数组长度小于2,说明地址格式不符合你预期的逗号分隔结构,直接触发locationAlertDialog()让用户手动输入即可。

修复后的完整代码

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data); // 记得调用父类方法,避免生命周期问题
    if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
            Place place = PlacePicker.getPlace(parentActivity, data);
            String fullAddress = place.getAddress().toString();
            String[] address = fullAddress.split("\\,");
            
            // 先判断数组长度是否满足要求,再检查目标元素是否为空
            boolean needManualInput = false;
            if (address.length < 2) {
                needManualInput = true;
            } else {
                String targetSegment = address[address.length-2].trim();
                needManualInput = targetSegment.isEmpty();
            }
            
            if (needManualInput) {
                // 地址格式不完整,弹出弹窗让用户手动输入
                locationAlertDialog();
            } else {
                // 地址格式正常,拼接后设置到输入框
                String location = String.format("%s,%s,%s", 
                    place.getName(), 
                    address[address.length-2].trim(), 
                    address[address.length-1].trim());
                locationET.setText(location);
                // 如果这里需要弹窗也可以调用,根据你的业务需求调整
                // locationAlertDialog();
            }
        } else if (requestCode == Config.PICK_FILE_REQUEST) {
            if (data == null) {
                // no data present
                return;
            }
        }
    }
}

额外的优化点

  1. 调用父类方法:添加super.onActivityResult(...)是Activity生命周期的规范操作,避免潜在的回调异常。
  2. 空值/空格处理:对拆分后的地址段做trim()处理,避免因为首尾空格导致的“空值”误判。
  3. 代码可读性:用needManualInput变量来统一判断逻辑,让代码更清晰易懂。
  4. 格式拼接优化:用String.format()替代字符串拼接,代码更整洁。

这样修改后,不管用户选择的地址是短格式还是不完整的格式,都能正常触发弹窗逻辑,不会再出现崩溃了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:54