无法访问数组的最后一个元素

时间:2013-08-28 13:35:12

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

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

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

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

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

它们是x不同的列,但每列的名称仅存储在行[0] [x]上。 它们是不同的行,值存储为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时,它也走得太远了。 为什么呢?

7 个答案:

答案 0 :(得分:2)

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

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.
    }
}

答案 1 :(得分:1)

  

x&lt;指数[X]。长度

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

index.length < x

答案 2 :(得分:1)

你应该检查

x < index[0].length

最好检查

index != null && index.length > 0
在访问索引之前

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

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;
}

答案 3 :(得分:0)

你完全忽略了数组边界。你在哪里确定你的while循环你的x变量不是太大?不通。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

在检查后,您正在增加值。这导致下一次检查太多了。你可以通过添加这样的制动声明来解决这个问题。

    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循环,如果你检查一个数组的长度,它们会更难以得到这样的错误。

答案 6 :(得分:0)

您可以使用旧程序

public class 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 ----&gt;&gt;&gt;

x = 1 val = dev true


但是你申报时必须注意一件事 static String [] [] index = new String [1] [3];

这里编译器初始化'index' index [0] [0] = null,index [0] [1] = null,index [0] [2] = null

但没有索引[0] [3]

所以它会显示ArrayIndexOutOfBoundsException

如果你的程序中有'n'个元素,那么做一件事情 然后像这样宣布'index'

static String [] [] index = new String [1] [n + 1];