【问题标题】:IndexOutOfBoundsException on List<Address>List<Address> 上的 IndexOutOfBoundsException
【发布时间】:2017-01-16 16:47:09
【问题描述】:

在我的 Android 应用中,我有以下代码:

LatLng[] branches;
String[] branchesArray = HomeActivity.branches.toArray(new String[HomeActivity.branches.size()]);

for (int i = 0; i < HomeActivity.branches.size(); i++) {
    branches[i] = getLocationFromAddress(branchesArray[i]);
}

getLocationFromAddress 方法:

public LatLng getLocationFromAddress(String strAddress) {

    Geocoder coder = new Geocoder(this);
    List<Address> address;
    LatLng p1 = null;

    try {
        address = coder.getFromLocationName(strAddress, 1);

        if (address == null) {
            return null;
        }

        Address location = address.get(0);
        location.getLatitude();
        location.getLongitude();

        p1 = new LatLng((double) (location.getLatitude()), (double) (location.getLongitude()));
    } catch (IOException e) {
        Log.e("Error", e.getMessage());
    }

    return p1;
}

这段代码应该创建一个LatLng 的数组,从字符串地址数组中提取。问题是每当我运行这段代码时,我都会在日志中得到java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0。它将第 137 行称为有问题的行,即这一行:

Address location = address.get(0);

我该如何解决这个问题?

【问题讨论】:

  • 为什么不直接使用HomeActivity.branches.get(i) 而不是branchesArray[i]
  • 你觉得location.getLatitude();location.getLongitude(); 会怎么做?

标签: java android indexoutofboundsexception street-address


【解决方案1】:

问题是您忘记使用正确的大小初始化“分支”变量,这就是您获得“大小 0 索引 0”的原因

String[] branches = HomeActivity.branches.toArray(new String[HomeActivity.branches.size()]);

【讨论】:

  • 我不明白你的回答。您刚刚从我的代码中复制了该行,但将 branchesArray 更改为 branches。什么意思?
  • 您的循环超出索引 0 并且在您初始化 String[] 分支时;您喜欢说我正在创建一个空数组,其大小为 0 数组不像 List 那样您可以在不知道前面大小的情况下不确定地附加项目。另一方面,必须使用定义的大小创建数组,因此 String branches[] 是一个数组大小为 0(空),String[] branches = new String[20] 是一个可以容纳 20 个项目而不会出现 indexOutOfBound 问题的数组跨度>
  • 这就是为什么当你循环到达 1 或(在你的情况下我猜是 0)branch[1] = getLocationFromAddress(branchesArray[1]);它会引发错误,因为您确实告诉您分支 var 的最大长度是 1 甚至 0 )
【解决方案2】:

getLocationFromName 文档说:

返回地址对象的列表。如果没有,则返回 null 或空列表 找到匹配项或没有可用的后端服务。

在你的情况下它返回一个空列表,所以你应该添加一个额外的检查:

public LatLng getLocationFromAddress(String strAddress) {

    Geocoder coder = new Geocoder(this);
    List<Address> address;
    LatLng p1 = null;

    try {
        address = coder.getFromLocationName(strAddress, 1);

        if (address == null || address.isEmpty()) {
            return null;
        }

        Address location = address.get(0);

        p1 = new LatLng(location.getLatitude(), location.getLongitude());
    } catch (IOException e) {
        Log.e("Error", e.getMessage());
    }

    return p1;
}

【讨论】:

  • 问题是我不需要它返回null。我需要它返回一个LatLng 对象。
猜你喜欢
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 2013-09-20
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多