【问题标题】:Array error java.lang.ArrayIndexOutOfBoundsException: length=1; index=1数组错误 java.lang.ArrayIndexOutOfBoundsException: length=1;索引=1
【发布时间】:2019-03-30 13:31:33
【问题描述】:

我有一个格式为 province;capital 的数组。

provArray = new String[] { "Alberta;Edmonton", "British Columbia;Victoria", "Manitoba;Winnipeg", "New Brunswick:Fredericton",
            "Newfoundland and Labrador;St.John's", "Nova Scotia;Halifax", "Ontario;Toronto", "Prince Edward Island;Charlottetown",
            "Quebec;Quebec City", "Saskatchewan;Regina", "Northwest Territories;Yellowknife", "Nunavut;Iqaluit", "Yukon;Whitehorse",
            "Alabama;Montgomery", "Alaska;Juneau", "Arizona;Phoenix", "Arkansas;Little Rock", "California;Sacramento", "Colorado;Denver",
            "Connecticut;Hartford"};

然后我有一个将省份与首都分开的 for 循环(在“;”之前和之后)。然而由于某种原因,我得到了错误,java.lang.ArrayIndexOutOfBoundsException: length=1; index=1

for(int k = 0; k < bonusArray.length; k++){
    String[] split = bonusArray[k].split(";");
    String prov = split[0];
    String cap = split[1];

    if(prov.equals(answer)){
       bonusAnswer = cap;
    }
}

我该如何解决这个错误?

编辑:已修复,我不小心将 : 而不是 ; 用于我的数组项之一。

【问题讨论】:

  • 请考虑这不是存储这些数据的最佳方式:定义一个类 Province,它将名称和大写存储为单独的字段,您可以像 new Province("Alberta", "Edmonton") 一样初始化它。

标签: java arrays android-studio indexoutofboundsexception


【解决方案1】:

数组中有没有;(分号)的值,比如New Brunswick:Fredericton

所以这段代码

String[] split = bonusArray[k].split(";"); 给出一个长度为 1 的数组

这会导致异常String cap = split[1];,因为您只能访问split[0](记住长度= 1)。

因此,您必须确保数组中的每个元素都有;,或者在访问它们的值之前检查split 变量的长度。

【讨论】:

  • 例如"New Brunswick:Fredericton".
  • @AndyTurner 完全正确!
  • 谢谢你!没有意识到,这似乎已经解决了!
  • @Revo 不客气。太好了,你解决了问题!记得up-vote所有对你有帮助的答案和accept一个让未来的读者发现这些帖子有用。
【解决方案2】:

您在“New Brunswick:Fredericton”中有错字,需要分号而不是常规冒号

【讨论】:

  • 谢谢你!没发现,好像已经修复了
【解决方案3】:
 String[] split = bonusArray[k].split(";");

您只是假设,您将始终获得具有 2 个元素的 split 变量。在这种情况下,您的输入中有一些元素在拆分时不返回 2 个元素,split() 并没有真正返回 2 个元素,这就是 ArrayIndexOutOfBoundsException 的原因。

在访问指定索引处的元素之前,始终检查“数组长度”。

编辑: "New Brunswick:Fredericton" 在此字符串上调用 split(";") 不会返回 2 个元素。

【讨论】:

  • 例如哪个不返回两个元素?
【解决方案4】:

“新不伦瑞克:弗雷德里克顿”不包含“;” . 尝试将 split() 和 [0], [1] 部分嵌入到 try-catch 块中,以确保不会发生 OutOfBoundsException。

【讨论】:

    【解决方案5】:

    我们可以通过多种方式做到这一点,但最好的方法是使用split.length-1,而不是将硬编码值作为索引。通过使用它,即使数组长度为 1,您也永远不会出现此异常。

    for(int k = 0; k < bonusArray.length; k++){
        String[] split = bonusArray[k].split(";");
        String prov = split[0];
        String cap = split[split.length-1];
    
        if(prov.equals(answer)){
           bonusAnswer = cap;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2013-08-17
      • 2013-11-19
      相关资源
      最近更新 更多