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; } } } }
额外的优化点
- 调用父类方法:添加
super.onActivityResult(...)是Activity生命周期的规范操作,避免潜在的回调异常。 - 空值/空格处理:对拆分后的地址段做
trim()处理,避免因为首尾空格导致的“空值”误判。 - 代码可读性:用
needManualInput变量来统一判断逻辑,让代码更清晰易懂。 - 格式拼接优化:用
String.format()替代字符串拼接,代码更整洁。
这样修改后,不管用户选择的地址是短格式还是不完整的格式,都能正常触发弹窗逻辑,不会再出现崩溃了。
内容的提问来源于stack exchange,提问作者Tommy Chong
相关产品推荐
相关产品推荐

