【问题标题】:Can't access last element of array无法访问数组的最后一个元素
【发布时间】:2013-08-28 13:35:12
【问题描述】:

我正在逐行解析一个 .CSV 文件,我想获取列的值。 以我的 .CSV 文件为例:

time;columnA;columnB,ColumnC
27-08-2013 14:43:00; this is a text; this too; same here

所以我所做的就是将内容存储在一个二维字符串数组中(感谢 split())。 我的数组如下:

array[0][x] = "time".
array[y][x] = "27-08-2013 14:43:00";

它们是 x 个不同的列,但每列的名称仅存储在 line[0][x] 上。 它们是 y 个不同的行,其中的值存储为 String。

我的问题如下,我想获取数据的 [x] 位置,但是当我尝试访问数组的最后一个 [x] 元素时。 我收到此错误消息

java.lang.ArrayIndexOutOfBoundsException: 17
    at IOControl.ReadCsvFile.getPosVar(ReadCsvFile.java:22)
    at IOControl.ReadCsvFile.<init>(ReadCsvFile.java:121)
    at en.window.Main.main(Main.java:48)

显然我读的很远,但是怎么读呢?

这是我的代码:

//Retrieves the x position of the variable var given as parameter.
private int getPosVar(String[][] index, String var)
{
    int x = 0;
    boolean cond = false;
    while((index[0][x] != null) && (cond != true))
    {
        if (index[0][x].contains(var) == true)
        {
            cond = true;
        }
        x++;
    }
    System.out.println("x = " +x+ "  val = " +index[0][x]);
    return(x);
}

我认为这可能是因为我没有检查我的 x 值是否小于完整字符串。 像这样:

x < index[x].length

但实际上我并没有改变任何东西,当我给出一个未知的String var 时,它也太过分了。 为什么?

【问题讨论】:

  • 您有 4 列,但尝试访问 17?
  • 不,在我的真实测试文件中,我有大量数据,为了理解目的,我确实把它们删掉了。但实际上我有 17 列,我尝试访问第 17 列;)
  • 如果你有 17 列,最后一个索引是 16,因为索引从 0 开始。用调试器检查你的代码。

标签: java csv multidimensional-array indexoutofboundsexception string-parsing


【解决方案1】:

在使用前检查索引的有效性也是一个好主意:

if ( index == null || index.length == 0 ) return -1;

你的 while 循环应该看起来更像这样:

while ( x < index[0].length )
{
    if ( index[0][x] == null )
    {
        x++;
        continue; // skip possible null entries.
    }

    if ( index[0][x].contains(var) )
    {
        System.out.println("x = " + x + ", val = " + index[0][x]);
        return x; // return the position found.
    }
    x++;
}
return -1;

使用 for 循环(我更喜欢):

for ( int x = 0; x < index[0].length; x++ )
{
    if ( index[0][x] == null )
        continue; // skip possible null entries.

    if ( index[0][x].contains(var) )
    {
        System.out.println("x = " + x + ", val = " + index[0][x]);
        return x; // return the position found.
    }
}

【讨论】:

  • 我没想到会这么简单:o 奇怪。 Break 绝对是很有帮助的!非常感谢!
  • @trolologuy,如果您需要留在方法内,请使用break,否则只需使用return 即可返回您所追求的结果。
【解决方案2】:

x

问题不在于index[x] 的长度,而在于x 太大。您需要检查:

index.length < x

【讨论】:

  • hmmm 所以当我做 index[x] 时,我会检查 index[x] 处的字符串的长度,而当我只检查 x 时它不一样?
  • @trolologuy index.length 是主数组的长度,index[x].length 是位置x 的数组长度。 index[x][y].length 将是 (x, y) 处字符串的长度。
  • 嗯,最后很合乎逻辑^^ 非常感谢,我不是这么理解的,现在我理解了。
【解决方案3】:

你应该检查一下

x < index[0].length

最好检查一下

index != null && index.length > 0

在访问索引之前。

在您找到正确的结果后,您的代码也会增加“x++”,因此 x 会进一步移动一个元素。 如果您现在找到最后一个元素或/没有元素,那么这将设法溢出数组边界,因此

System.out.println("x = " +x+ "  val = " +index[0][x]);

会抛出错误。

我建议这样改:

private int getPosVar(String[][] index, String var)
{
    int x = 0;
    boolean found = false;

    if(index == null || index.length == 0 || var == null)
        return -1;

    while((x < index[0].length))
    {
        if (index[0][x].contains(var))
        {
            System.out.println("x = " +x+ "  val = " +index[0][x]);
            return(x);
        }
        x++;
    }
    System.out.println("  var = " + var + " not found");
    return -1;
}

【讨论】:

    【解决方案4】:

    您完全忽略了数组边界。您在哪里确保在您的 while 循环中您的 x 变量不会太大?无处可去。

    【讨论】:

    • 我试过这个:x &lt; index[x].length,但其他回复者让我明白,我做错了,我应该检查index.length &lt; x
    【解决方案5】:

    在 while 循环结束时,增加 x 的值。之后您尝试在 sysout 方法中再次获取该值。

    编辑:尝试将 x++ 放在 else 块中。

    【讨论】:

      【解决方案6】:

      因为您在检查后要增加值。这导致下一次检查太多。你可以简单地通过添加这样的刹车语句来解决这个问题。

          public static void main(String[] args) {
          String var = "c";
          String[][] index = {{"a","b","c"},{"a","b","c"}};
          int x = 0;
          boolean cond = false;
          while( (index[0][x] != null) && (cond != true) )
          {
              if (index[0][x].contains(var) == true)
              {
                  cond = true;
                  break;
              }
              x++;
          }
          System.out.println("x = " +x+ "  val = " +index[0][x]);
      

      此外,您应该始终尝试使用 forloop 而不是 while 循环,如果您检查数组的长度,它们会更难出现此类错误。

      【讨论】:

        【解决方案7】:

        您可以使用旧程序

        公共类 TwoDStringArray {

        static String[][] index = new String[1][3];
        
        public static void main(String[] args) {
        
            index[0][0] = "amal";
            index[0][1] = "dev";
        
            int x = 0;
            boolean cond = false;
            String var = "dev";
            while((index[0][x] != null) && (cond != true))
            {
        
                if (index[0][x++].equals(var) == true)
                {
                    cond = true;
                    x--;
                }
            }
        
            System.out.println("x = " +x+ "  val = " +index[0][x] + "    "+ cond);
        }
        

        }

        O/P ---->>>

        x = 1 val = dev true


        但你在声明时必须注意一件事 静态字符串[][] 索引 = 新字符串[1][3];

        这里编译器用 索引[0][0]=null , 索引[0][1]=null , 索引[0][2]=null

        但是没有索引[0][3]

        所以它会显示 ArrayIndexOutOfBoundsException

        如果你的程序中有“n”个元素,那就做一件事 然后像这样声明'index'

        静态字符串[][] 索引 = 新字符串[1][n+1];

        【讨论】:

          猜你喜欢
          • 2015-09-25
          • 1970-01-01
          • 1970-01-01
          • 2010-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-08
          • 2022-06-15
          相关资源
          最近更新 更多