【问题标题】:Array out of bound exception while splitting the String拆分字符串时数组越界异常
【发布时间】:2015-07-13 00:15:33
【问题描述】:

使用 ',' 拆分字符串时,出现 Array 超出范围异常。请在程序下方找到。

public static void main(String[] args) {
    String c="1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
    System.out.println(c.split(",")[11]);
}

即使第 11 个元素为空,我也想打印空字符串(因为在某些记录中,第 11 个元素不为空)。 请帮助我调试错误。

【问题讨论】:

  • 你可以打印数组c.split(",") 返回:[1, 10k ABC D, XYZ AB, , , , , , 12345]

标签: java string split indexoutofboundsexception


【解决方案1】:

也许你想要

c.split(",", -1);

这将在末尾保留空字符串。

【讨论】:

    【解决方案2】:

    看看String类中的split方法描述:

    这个方法的工作方式就像通过调用两个参数的方法一样 给定表达式和零极限参数。尾随空字符串 因此不包含在结果数组中。

    所以,split 从数组中删除 尾随 空字符串。在您的示例中,结果数组是:

    '1'
    '10k ABC D'
    ' XYZ AB'
    ''
    ''
    ''
    ''
    ''
    '12345'
    

    如果您要拆分以下字符串(最后一个逗号前有一个空格):

    "1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,"

    结果数组将是:

    '1'
    '10k ABC D'
    ' XYZ AB'
    ''
    ''
    ''
    ''
    ''
    '12345'
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ''
    ' '
    

    【讨论】:

      【解决方案3】:

      试试这个会对你有帮助。

      String c="1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
      System.out.println(c.split(",",-1)[11]);
      

      【讨论】:

        【解决方案4】:

        试试这个!

        String c="1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
        System.out.println(c.split(",",-1)[11]);
        

        【讨论】:

          【解决方案5】:

          c.split(",") 的结果是一个包含 9 个元素的字符串数组。如果您使用此代码,您可以查看此内容:

          String c="1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
              String[] s = c.split(",");
          
              for(int i = 0; i < s.length; i++){
                  System.out.println(i);
                  System.out.println(s[i]);
              }
          

          如果您想要除 ',' 字符之外的所有内容,则必须在拆分中使用“,+”而不是“,”。这个正则表达式 4 结果,它的作用是忽略所有的 ','。

          【讨论】:

            【解决方案6】:

            假设拆分后生成的数组是splittedArray,会是这样-

            String splittedArray = {"1","10k ABC D", "XYZ" "AB","", "" "","","12345"};
            

            您可以看到splittedArray[11] 处没有元素。 splittedArray 的大小是 9。如果你像这样修复索引 11 则不会发生错误 -

            String c="1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
            System.out.println(c.split(",")[8]);
            

            输出:
            12345

            【讨论】:

              【解决方案7】:

              如果在没有任何参数的情况下应用 Java 拆分方法,它会丢弃尾随的空元素。因此,如果您在将结果值分配给数组时进行调试,如下所示,您会注意到结果数组中只有 9 个元素以元素“12345”结尾。

              String[] arr = c.split(",");
              

              您可以按如下方式传递限制参数(如果限制参数为非正数,则模式将尽可能多次应用,并且数组可以有任意长度),这样拆分方法将返回一个带有尾随的数组空元素。

              public static void main(String[] args) {
                 String c="1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
                 System.out.println(c.split(",", -1)[11]);
              }
              

              【讨论】:

                【解决方案8】:

                希望下面的代码有所帮助

                public static void main(String[] args) {
                    String cvsSplitBy =",(?=([^\"]*\"[^\"]*\")*[^\"]*$)";
                    String c="1,10k ABC D, XYZ AB,,,,,,12345,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
                    String sTemp[] = c.split(cvsSplitBy);
                    for(int i=0;i<sTemp.length;i++){
                        if(((String) c.split(cvsSplitBy)[i])!=null && (!"".equals((String) c.split(cvsSplitBy)[i].trim())))
                    System.out.println((String) c.split(cvsSplitBy)[i]);
                    }
                

                以上代码的输出

                1
                10k ABC D
                XYZ AB
                12345

                【讨论】:

                  【解决方案9】:

                  根据splitdocumentation

                  此方法的工作方式就像通过使用给定表达式和零限制参数调用双参数拆分方法一样。因此,尾随的空字符串不包含在结果数组中。

                  这是由java.util.regex.Pattern中的方法split的源代码验证的,被Stringsplit使用

                  if (limit == 0)
                      while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
                          resultSize--;
                  

                  你的数组的实际大小是 9

                  【讨论】:

                    猜你喜欢
                    • 2015-01-31
                    • 1970-01-01
                    • 2014-07-31
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-08-01
                    • 2013-12-08
                    • 2014-10-16
                    相关资源
                    最近更新 更多